無Maven不項目,這是我的口號,但是一直沒有系統(tǒng)的去看書,前段時間把《Maven實戰(zhàn)》過了一遍做了些筆記,方便后面查閱
每個項目都有自己的坐標(biāo)
- groupId
- artifactId
- version
- packaging
-
classifier
1.png

- install 安裝在本地
- deploy 打包發(fā)布到遠端
依賴范圍

范圍類型有: 編譯、測試、運行 三種classpath
- compile,默認(rèn)值,對編譯、測試、運行三種classpath都有效;
- test: 測試依賴范圍,只對測試classpath有效,在編譯主代碼或者裕興項目的使用是則無法使用此類依賴。
- provided: 已提供依賴范圍 只在編譯和測試classpath有效,運行時無效。
- runtime: 運行時依賴范圍,對測試和運行classpath有效,編譯無效;
-
system: 系統(tǒng)依賴范圍,
4.png
(如第三方給的jar包,且倉庫中心又沒有,可以使用system范圍,如)
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/lib/jsoup-proxy.jar</systemPath>
</dependency>
-
import(Maven 2.0.0及以上):導(dǎo)入依賴范圍。不會對三種classpath產(chǎn)生實際的影響;(不夠嚴(yán)謹(jǐn),類似complie還是什么?)
5.png
傳遞性依賴
[圖片上傳失敗...(image-592326-1560672958805)]
依賴調(diào)解
兩個依賴關(guān)系
A->B->C->X(1.0)
A->D->X(2.0)
兩個依賴都間接來到X,
maven引用原則(依賴調(diào)解(Dependency Mediation))
- 第一原則:路徑最緊者優(yōu)先 即 x(2.0)會被使用
A->B->Y(1,0)
A->C->Y(2,0)
- 第二原則: 在滿足第一原則的前提下第一聲明者優(yōu)先(就近原則) 即 Y(2,0)會被使用
可選依賴

[圖片上傳失敗...(image-b3618b-1560672958805)]


倉庫的布局

生命周期
-
clean:清理項目
13.png -
default: 構(gòu)建項目
14.png -
site: 建立項目站點
16.png

繼承
正確的設(shè)置relativePath很重要

可繼承的pom元素

依賴范圍 import的用法

插件跟依賴一樣可以使用*Management來管理


反應(yīng)堆




對于裁剪功能,需要用的時候可以查閱文檔
測試


跳過測試
mvn package -DskipsTests



注意:上述幾種命令行動態(tài)指定測試類的方法都應(yīng)該只是臨時使用,如果長時間只運行項目的某幾個測試,那么測試就會慢慢失去其本來的意義。
加入測試

也可以使用excludes排除一些測試

WEB應(yīng)用

版本號定義約定

[圖片上傳失敗...(image-676088-1560672958805)]
Maven屬性
內(nèi)置屬性:
${basedir} 標(biāo)識項目根目錄即包含pom.xml 文件的目錄;
${version}標(biāo)識項目版本;
POM屬性:
-
${project.artifactId}對應(yīng)了<project><artifactId>元素的值 -
${project.build.sourceDirectory}項目的主源碼目錄 默認(rèn)src/main/java/ -
${project.build.testSourceDirectory}項目的測試源碼目錄,默認(rèn)為src/test/java -
${project.outputDirectory}項目主代碼編譯輸出目錄,默認(rèn)為target/classes -
${project.testOutputDirectory}: 項目測試代碼編譯輸出目錄 ,默認(rèn)為target/testclasses/ -
${project.groupId}: 項目的groupId -
${project.artifactId}項目的artifactId -
${project.version}項目的version 與${version}等價 -
${project.build.finalName}項目打包輸出文件的名稱,默認(rèn)為${project.artifactId}-${project.version}
自定義屬性
可以通過<properties><xxx>val</xxx></properties>
Setting屬性

Java屬性變量
[圖片上傳失敗...(image-d9785b-1560672958805)]
環(huán)境變量屬性

最佳實踐
- artifactId 使用實際項目名稱作為artifactId的前綴
- 優(yōu)化依賴: 使用
dependency:list或dependency:tree來查看依賴關(guān)系 -
mvn clean install在執(zhí)行真正的項目構(gòu)建之前清理項目是一個很好的實踐





