以前開發(fā)的時(shí)候,如果A項(xiàng)目需要某個(gè)jar包盯荤,可能去網(wǎng)上搜索下載jar包馋吗,然后復(fù)制粘貼在開發(fā)對應(yīng)的位置,如果B項(xiàng)目也需要這個(gè)jar包秋秤,那么同樣需要再次手動(dòng)復(fù)制粘貼到對應(yīng)的位置宏粤。
為了解決這個(gè)問題脚翘,包管理應(yīng)運(yùn)而生,其中最通用以maven和gradle為主绍哎,前者主要側(cè)重于java項(xiàng)目来农,后者側(cè)重于android項(xiàng)目。注意崇堰,說的是側(cè)重于沃于,而不是就是。
什么是maven呢海诲,讓我們來看下官方定義
At first glance Maven can appear to be many things, but in a nutshell Maven is an attempt to apply patterns to a project's build infrastructure in order to promote comprehension and productivity by providing a clear path in the use of best practices. Maven is essentially a project management and comprehension tool and as such provides a way to help with managing:
- Builds
- Documentation
- Reporting
- Dependencies
- SCMs
- Releases
- Distribution
If you want more background information on Maven you can check out The Philosophy of Maven and The History of Maven. Now let's move on to how you, the user, can benefit from using Maven.
通過官方定義我們可以知道m(xù)aven通俗來說就是管理項(xiàng)目周期的繁莹,包括了我們最常聽到的,編譯饿肺,下載蒋困,依賴,部署等敬辣。
如何下載安裝Maven
這一步我就不再贅述了雪标,網(wǎng)上隨便一搜就是一大堆
如何驗(yàn)證下載安裝是否成功呢(一般是配了系統(tǒng)環(huán)境的),在命令行的任一個(gè)目錄下輸入mvn -v
溉跃,出現(xiàn)類似以下信息則說明配置成功村刨,包括了mvn的版本號(hào)。
基本概念和配置
在構(gòu)建一個(gè)maven應(yīng)用之前可以先來講下關(guān)于倉庫的基本概念和一些必要的配置撰茎。
本地倉庫:在本地pc中劃分一個(gè)文件夾來存儲(chǔ)jar包
中心倉庫:maven官方統(tǒng)一管理jar包的倉庫
遠(yuǎn)程倉庫:自己或者公司搭建的給內(nèi)部團(tuán)隊(duì)使用的jar包的倉庫
當(dāng)引入一個(gè)依賴的時(shí)候
去本地倉庫尋找是否有jar包
如果沒有則去maven管理的中心倉庫去尋找
如果中央倉庫還沒有嵌牺,就會(huì)去遠(yuǎn)程倉庫尋找,如果連遠(yuǎn)程倉庫都沒有創(chuàng)建龄糊,那么直接拋出錯(cuò)誤逆粹,找不到依賴
有遠(yuǎn)程倉庫,但是遠(yuǎn)程倉庫也找不到需要的jar包炫惩,同樣會(huì)拋出錯(cuò)誤僻弹,找不到依賴
除此之外,還有一個(gè)鏡像的概念他嚷,只要倉庫A能夠包含倉庫B所有的jar包蹋绽,那么就可以說A是B的鏡像。由于一些不可抗因素筋蓖,有時(shí)候訪問不了中心倉庫卸耘,這時(shí)候就需要用阿里云或者其他的鏡像倉庫來提高訪問效率。
目前為止只需要了解這幾個(gè)概念粘咖,了解完后就是進(jìn)行設(shè)置蚣抗,對本地倉庫的位置、鏡像倉庫的url和遠(yuǎn)程倉庫的url設(shè)置瓮下。
默認(rèn)的配置文件路徑是${user.home}/.m2/settings.xml
翰铡,默認(rèn)的本地倉庫地址是${user.home}/.m2/repository/
可以看到有兩個(gè)層級(jí)设哗,一個(gè)是用戶級(jí)別的修改,那么配置文件就是對應(yīng)${user.home}/.m2/settings.xml
两蟀,另外一個(gè)是全局修改,也就是對所有用戶都生效震缭,那么配置文件的路徑對應(yīng)的則是${maven.home}/conf/settings.xml
修改本地倉庫位置
添加鏡像地址
配置遠(yuǎn)程倉庫
在配置鏡像和遠(yuǎn)程倉庫的時(shí)候赂毯,記得id標(biāo)簽是全局唯一的
查看當(dāng)前生效的配置文件,可以采用mvn help:effective-settings
可以看到配置文件中去掉了多余注釋的部分拣宰,只留下了剛才手動(dòng)配置的本地倉庫和鏡像倉庫的位置党涕。
搭建第一個(gè)maven應(yīng)用
使用命令行來搭建第一個(gè)maven應(yīng)用,以后可能99.99%的情況都是直接通過idea來搭建
mvn -B archetype:generate -DgroupId=com.maven.learn.cutey -DartifactId=my-first-maven -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4
可以先不管這串命令是啥意思巡社,等后面講了再回過頭來看會(huì)有種不一樣的感覺膛堤,生成項(xiàng)目后使用tree來看項(xiàng)目的目錄結(jié)構(gòu)長啥樣
有個(gè)pom.xml,也就是后面常說的pom文件晌该,全名Project Object Model
項(xiàng)目對象模型文件肥荔,描述這個(gè)項(xiàng)目的。
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="xml" cid="n71" mdtype="fences" style="font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none; box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); border: 1px solid rgb(231, 234, 237); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; caret-color: rgb(51, 51, 51); color: rgb(51, 51, 51); position: relative !important; background-position: inherit; background-repeat: inherit;"><?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.maven.learn.cutey</groupId>
<artifactId>my-first-maven</artifactId>
<version>1.0-SNAPSHOT</version>
<name>my-first-maven</name>
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
</build>
</project>
</pre>
有幾個(gè)非常常用的標(biāo)簽
groupId
也就是組織id朝群,一般是公司的域名倒寫artifactId
可以簡單的理解為項(xiàng)目id燕耿,一般是通過groupId:artifactId
來定位一個(gè)jar包dependencies
依賴,可以通俗的理解為jar包
其他的都可以顧名思義姜胖,這里就不再一一解釋誉帅。
常用命令
編譯 compile
在往常會(huì)使用javac來編譯得到class文件來執(zhí)行,在maven中也有類似的命令右莱,使用mvn compile
對項(xiàng)目進(jìn)行編譯蚜锨。編譯完成后再看下文件目錄結(jié)構(gòu),可以發(fā)現(xiàn)多了target目錄慢蜓,然后對應(yīng)的路徑上也有了class文件亚再。
進(jìn)到classes文件夾下,使用java命令行啟動(dòng)java文件胀瞪,可以發(fā)現(xiàn)能正常運(yùn)行
測試 test
在上面的目錄結(jié)構(gòu)中针余,除了main文件夾,還有一個(gè)test文件夾目錄凄诞,也就是常說的測試用例目錄圆雁。
默認(rèn)的測試用例比較簡單,沒有什么好說的帆谍∥毙啵可以使用mvn test
來運(yùn)行測試用例
測試用例能夠跑成功,然后再次使用tree來看下目錄結(jié)構(gòu)
可以看到又增加了一些文件汛蝙,其中surefire-reports是maven的一個(gè)插件烈涮。還有一個(gè)值得注意的點(diǎn)是看到了testCompile
朴肺,說明是mvn test
也是經(jīng)過編譯后才運(yùn)行的
那么mvn test-compile
即可達(dá)到只編譯不運(yùn)行的效果。
打包 package
真實(shí)情況下一般是不會(huì)編譯所有的文件坚洽,然后放在服務(wù)器上跑class文件的戈稿,而是把項(xiàng)目打包成一個(gè)jar包運(yùn)行,或者打成war包部署在服務(wù)器的tomcat上運(yùn)行讶舰。
使用mvn package
即可按照進(jìn)行打包鞍盗,打包完后使用tree
查看目錄結(jié)構(gòu)
赫然可以看到有個(gè)jar包生成,然后使用java -jar
命令行執(zhí)行jar包跳昼。但是般甲,在這個(gè)例子里是會(huì)報(bào)錯(cuò)的。
上網(wǎng)查找資料后發(fā)現(xiàn)是缺少了主啟動(dòng)類的入口鹅颊,不過在之后的springboot項(xiàng)目中沒有這種煩惱敷存,應(yīng)該是已經(jīng)配好了,感興趣的同學(xué)可以一層一層地看下spring的pom文件堪伍。解決方法是在pom文件加入以下代碼锚烦。
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="xml" cid="n104" mdtype="fences" style="font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none; box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); border: 1px solid rgb(231, 234, 237); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; caret-color: rgb(51, 51, 51); color: rgb(51, 51, 51); position: relative !important; background-position: inherit; background-repeat: inherit;"><plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.maven.learn.cutey.App</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins></pre>
注意
<plugins>
是放在build標(biāo)簽下,而不是pluginManagement標(biāo)簽下
再來使用java -jar
執(zhí)行jar包帝雇,可以看到能夠正確執(zhí)行挽牢。
下載到本地 install
完成了以上的工作后,去本地的jar包上看是還沒有的摊求。
但是在現(xiàn)實(shí)的開發(fā)環(huán)境中禽拔,一個(gè)project是由多個(gè)module組成的,各個(gè)module之間可能需要引用依賴室叉,這就可能要求把開發(fā)好的module下載到本地供其他module使用睹栖。使用mvn install
即可完成上述要求
可以看到在對應(yīng)的位置上已經(jīng)生成了jar包以及對應(yīng)的版本號(hào)等,而所謂對應(yīng)的位置也就是由我們一開始自定義的groupId和artifactId共同組成茧痕。
清除target目錄 clean
有些情況下可能需要清除編譯生成的二進(jìn)制文件野来,然后再編譯,這就需要用到mvn clean
了
可以看到清楚完后踪旷,目錄結(jié)構(gòu)又變得很干凈了曼氛。但是,注意令野,雖然target目錄清空了舀患,install下載jar包到本地的jar包在本地倉庫還是存在的。
骨架 archetype
archetype 的意思是原型气破,可以理解為模版或者骨架聊浅,但更本質(zhì)地來說,它就是maven的一個(gè)插件。一開始搭建的第一個(gè)maven應(yīng)用就是用到了archetype低匙,但是是在命令行中配好了選擇哪個(gè)模版(maven-archetype-quickstart)旷痕,然后把groupId和artifactId都輸入了。
mvn -B archetype:generate -DgroupId=com.maven.learn.cutey -DartifactId=my-first-maven -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4
這次試試不自動(dòng)生成顽冶,采用mvn archetype:generate
出現(xiàn)了警告欺抗,說是在遠(yuǎn)程編錄中找不到骨架,只加載了本地的强重,所以我們只看到了10個(gè)internal的骨架佩迟,但是這不妨礙下來的動(dòng)作。所以這個(gè)報(bào)警可以不用管竿屹,如果有強(qiáng)迫癥的小伙可以上網(wǎng)搜下解決方案。
默認(rèn)選擇是7灸姊,一看第7個(gè)拱燃,就是maven-archetype-quickstart
,這次為了不同力惯,我手動(dòng)選擇10碗誉,也就是maven-archetype-webapp
,顧名思義就是web項(xiàng)目父晶。
選擇完骨架后就是去倉庫進(jìn)行下載哮缺,并且讓你填寫groupId和artifactId和一些基本值
查看下目錄結(jié)構(gòu)
自定義骨架
上面兩個(gè)例子都是采用別人的骨架,但是能夠自定義骨架呢甲喝,maven是提供這種支持的尝苇。
首先生成骨架,在項(xiàng)目的根目錄下埠胖,也就是和pom文件同級(jí)的目錄下采用mvn archetype:create-from-project
目錄結(jié)構(gòu)如下
其次切到target 中的archetype目錄下糠溜,先執(zhí)行mvn install
,再執(zhí)行mvn archetype:crawl
Build success后去前面設(shè)置的倉庫根目錄下
可以看到多出了一個(gè)archetype-catalog.xml
文件直撤,查看該文件內(nèi)容
可以看到最新的非竿,自定義的archetype也在該文件下,下面就嘗試看能不能成功使用自定義的骨架生成一個(gè)項(xiàng)目谋竖,照樣執(zhí)行mvn archetype:generate
可以看到第11個(gè)就是我們自己的archetype红柱,同時(shí)可以發(fā)現(xiàn),每個(gè)數(shù)字后面都跟著一個(gè)英文蓖乘,internal或者local锤悄,其實(shí)還有一個(gè)remote。有時(shí)候我們只想要local嘉抒,或者只想要remote铁蹈,maven也提供了這樣的命令加一個(gè)-DarchetypeCatalog=xxx
即可。
比如,mvn archetype:generate -DarchetypeCatalog=local
就是只加載本地的骨架
途中默認(rèn)選擇的是2握牧,但是3才是自定義的容诬,同樣輸入一些必要的信息
創(chuàng)作不易,如果對你有幫助沿腰,歡迎點(diǎn)贊览徒,收藏和分享啦!