什么是maven
首先薪捍,maven不是一個語言笼痹,不是一個框架,他是一個項目管理工具飘诗。
使用maven對項目進行構建与倡,依賴管理
所以界逛,maven與構建是掛了一個很大的勾勾的昆稿,搞清楚maven之前先要搞清楚構建是怎么個構建法的。
構建(build)
maven的出現(xiàn)之前息拜,我們是如何構建我們的項目的溉潭?
- 創(chuàng)建一個項目
- 編寫我們的代碼
- 當我們編寫完了之后,java文件會編譯輸出二進制文件
- 執(zhí)行單元測試
- 然后打包部署到服務器
- 然后開啟服務器
- 運行程序
根據上面的步驟少欺,我突然對之前所說的構建有了一個比較清晰的定位了喳瓣。
為什么會出現(xiàn)maven
所有新事物的出現(xiàn)必定是因為他之前太過麻煩了
這句話能夠解釋大部分計算機新起事物的理由。
在上面的所描述的構建流程里面赞别,我們很清晰地能感受到一種繁雜迎面而來畏陕,都是寫過無數項目的真實體驗。
我們每次導入一個jar包是多么的痛苦...
我們要手動測試所有的單元測試...
我們要手動打包我們的項目...
我們要手動地將我們的項目部署到服務器上門...
我想起來我之前寫項目的時候總是忘記把項目部署到服務器上...
那么maven的作用到底是什么呢仿滔?
maven可以幫我們把上面的流程全部做完惠毁,并且可以一步做完。
maven的作用是什么
1.maven的構建
maven執(zhí)行步驟:清理
--》編譯
--〉測試
--》報告
--〉打包
--》部署
maven可以一步幫我們執(zhí)行完所有崎页,當然我們也可以手控操作這些步驟:
maven的不同步驟都是對應著不同的簡單的指令
-
清理
: clean -
編譯
: compile -
打包
: package
2.maven的導入jar包的操作:解放雙手
項目里會有一個文件叫做pom.xml鞠绰,我們的包的導入都是寫在這個文件里面。
與之前不同的是飒焦,之前我們是真正事實得在做導入這個一個動作蜈膨,但是pom文件就類似于一個清單:
我們在清單里面羅列出我們想要的包以及這些包的版本。
最后,當我們mvn install
的時候翁巍,maven團隊會根據我們的pom文件驴一,在他們維護的maven倉庫
里面下載jar包。我們減少了我們每次手動導入jar包這樣一個非常繁瑣的過程曙咽!
3.maven倉庫
-
本地倉庫
:我們項目根據pom.xml清單下載下來的項目就是下載到本地倉庫里面的蛔趴;當然并不是一個項目一個本地倉庫,而是一個電腦一個本地倉庫例朱,所以孝情,當我們第一個項目下載了xx.jar,第二個項目當再次需要xx.jar的時候洒嗤,就不需要從遠程倉庫下載了箫荡,從本地倉庫拿就好了。
這個本地倉庫不需要我們自定義渔隶,是默認設置的羔挡。當我們接觸了一段時間的maven,我們一定會發(fā)現(xiàn)有這么一個文件夾叫做.m2
间唉,這個就是本地倉庫绞灼。
遠程倉庫
:互聯(lián)網倉庫,可以是在互聯(lián)網內也可以是在局域網內呈野。中央倉庫
:服務于整個互聯(lián)網低矮,有maven團隊自己維護,里面有非常多的jar包被冒。
maven命令
mvn clean
:清理军掂,刪除target目錄里面的內容(生成的 .class 文件)
mvn compile
:編譯,將java文件編譯成.class文件昨悼,并且放在target文件夾里面
mvn test
:測試蝗锥,會執(zhí)行src/test目錄下面的單元測試類
mvn package
:打包,將java工程打包成jar包率触,將web工程打包成war包
mvn install
:安裝终议,將maven打包好的包發(fā)布到本地倉庫
mvn deploy
:部署,將包復制到遠程倉庫
maven生命周期
clean生命周期階段:pre-clean
-->clean
-->post-clean
default生命周期階段:compile
-->test
-->package
-->install
-->deploy
site生命周期階段:pre-site
-->site
-->post-site
-->site-deploy
site:生成項目的站點文檔
如果我們執(zhí)行了mvn clean
葱蝗,那么真正執(zhí)行的其實是pre-clean 和 clean 兩個穴张,
同理,如果我們執(zhí)行了mvn install
垒玲,那么我們執(zhí)行的其實是陆馁,compile,test合愈,package叮贩,install击狮,
總結,執(zhí)行當前命令并不是只執(zhí)行當前階段益老,而是從最初彪蓬,執(zhí)行到當前階段截止。
但是捺萌,如果我們想要執(zhí)行兩個階段的生命周期呢档冬?比如我們想要執(zhí)行clean 以及 intall:
mvn clean install
我們如此命名便可。
pom.xml
前面提到了很多次pom.xml桃纯,我們知道他是一個jar包的羅列清單酷誓。那么這個清單的書寫格式我們肯定是必須知道的,因為我們導入jar包現(xiàn)在全靠寫pom.xml了态坦。
<dependencies>
<dependency>
<groupId>項目名稱</groupId>
<artifactId>模塊名稱</artifactId>
<version>版本</version>
<scrope>依賴范圍</scrope>
</dependency>
</dependencies>
當我們創(chuàng)建一個maven項目的時候盐数,上面的選擇也是我們所要定義的。
一般我們會把groupId
設置成我們的包名+項目名伞梯,grtifactId
設成我們的項目名玫氢;
<build>
<plugins>
<plugin>
<groupId>com.yq.test</groupId>
<artifactId>TestMavenProject</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>utf-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
configuration里面配置的1.8指的是我們的jdk版本是1.8的。
encoding很顯而易見是我們的編碼谜诫。
maven進階之jar包依賴沖突
1.什么是依賴沖突漾峡?
此時,我們有a包和b包喻旷,但是a包和b包里面同時依賴了c包(不同版本)生逸,此時我們有一個類是c包里面的。
當我們需要運用這個類的時候掰邢,系統(tǒng)就懵逼了牺陶,我們到底要的是哪一個版本的c包呢伟阔?
2.如何調解依賴沖突辣之?
誰先聲明誰優(yōu)先
在pom文件里面,如果我a包先聲明皱炉,那么我們就優(yōu)先取a包里面的c包怀估。誰近誰優(yōu)先
在pom文件里,比如:
a---》xx-1.jar
a---〉b----》xx-2.jar
由上因為xx-1.jar離a包其實最近合搅,所以優(yōu)先選擇xx-1.jar
3.如何避免產生依賴沖突多搀?
鎖定版本。xx包灾部,我們只用1版本的康铭,不用2版本的,這樣就不會產生依賴沖突了赌髓。