1. 程式人生 > >maven的dependency參數

maven的dependency參數

.html alt 命令 oracl frame 文件名 clas r12 使用

一、type

有時候我們引入某一個依賴時,必須指定type,這是因為用於匹配dependency引用和dependencyManagement部分的最小信息集實際上是{groupId,artifactId,type,classifier}。在很多情況下,這些依賴關系將引用沒有classifier的jar依賴。這允許我們將標識設置為{groupId,artifactId},因為type的默認值是jar,並且默認classifier為null。

type的值一般有jar、war、pom等,聲明引入的依賴的類型。

二、classifier

Classifier可能是最容易被忽略的Maven特性,但它確實非常重要,我們也需要它來幫助規劃坐標。設想這樣一個情況,有一個jar項目,就說是 dog-cli-1.0.jar 吧,運行它用戶就能在命令行上畫一只小狗出來。現在用戶的要求是希望你能提供一個zip包,裏面不僅包含這個可運行的jar,還得包含源代碼和文檔,換句話說,這是比較正式的分發包。這個文件名應該是怎樣的呢?dog-cli-1.0.zip?不夠清楚,僅僅從擴展名很難分辨什麽是Maven默認生成的構件,什麽是額外配置生成分發包。如果能是dog-cli-1.0-dist.zip就最好了。這裏的dist就是classifier,默認Maven只生成一個構件,我們稱之為主構件,那當我們希望Maven生成其他附屬構件的時候,就能用上classifier。常見的classifier還有如dog-cli-1.0-sources.jar表示源碼包,dog-cli-1.0-javadoc.jar表示JavaDoc包等等。

classifier它表示在相同版本下針對不同的環境或者jdk使用的jar,如果配置了這個元素,則會將這個元素名在加在最後來查找相應的jar,例如:

1 2 3 <code><code><code>上面的例子 <classifier>sources</classifier> <classifier>javadoc</classifier></code></code></code>
?
1 2 3 <code><code><code>給相同的version,構建不同的環境使用依賴
<classifier>jdk17</classifier> <classifier>jdk18</classifier></code></code></code>

三、optional

當project-A 依賴project-B, project-B 依賴project-D時

?
1 2 3 4 5 6 <code><code><code><dependency> <groupid>sample.ProjectD</groupid>
ProjectD</artifactid> <version>1.0-SNAPSHOT</version> <optional>true</optional> </dependency></code></code></code>

所以當project-B的true時, project-A中如果沒有顯式的引入project-D, 則project-A不依賴project-D, 即project-A可以自己選擇是否依賴project-D

默認的值為false, 及子項目必須依賴。

四、scope

scope的分類

compile

默認就是compile,什麽都不配置也就是意味著compile。compile表示被依賴項目需要參與當前項目的編譯,當然後續的測試,運行周期也參與其中,是一個比較強的依賴。打包的時候通常需要包含進去。

test

scope為test表示依賴項目僅僅參與測試相關的工作,包括測試代碼的編譯,執行。比較典型的如junit。

runntime

runntime表示被依賴項目無需參與項目的編譯,不過後期的測試和運行周期需要其參與。與compile相比,跳過編譯而已,說實話在終端的項目(非開源,企業內部系統)中,和compile區別不是很大。比較常見的如JSR×××的實現,對應的API jar是compile的,具體實現是runtime的,compile只需要知道接口就足夠了。oracle jdbc驅動架包就是一個很好的例子,一般scope為runntime。另外runntime的依賴通常和optional搭配使用,optional為true。我可以用A實現,也可以用B實現。

provided

provided意味著打包的時候可以不用包進去,別的設施(Web Container)會提供。事實上該依賴理論上可以參與編譯,測試,運行等周期。相當於compile,但是在打包階段做了exclude的動作。

system

從參與度來說,也provided相同,不過被依賴項不會從maven倉庫抓,而是從本地文件系統拿,一定需要配合systemPath屬性使用。

import(only available in Maven 2.0.9 or later)

這個是maven2.0.9版本後出的屬性,import只能在dependencyManagement的中使用,能解決maven單繼承問題,import依賴關系實際上並不參與限制依賴關系的傳遞性。

使用import scope解決maven繼承(單)問題

scope的依賴傳遞

A–>B–>C。當前項目為A,A依賴於B,B依賴於C。知道B在A項目中的scope,那麽怎麽知道C在A中的scope呢?答案是:
當C是test或者provided時,C直接被丟棄,A不依賴C;
否則A依賴C,C的scope繼承於B的scope。

五、systemPath

當maven依賴本地而非repository中的jar包,sytemPath指明本地jar包路徑,例如:

?
1 2 3 4 5 6 7 <code><code><code><code><code><code><dependency> <groupid>org.hamcrest</groupid> hamcrest-core</artifactid> <version>1.5</version> <scope>system</scope> <systempath>${basedir}/WebContent/WEB-INF/lib/hamcrest-core-1.3.jar</systempath> </dependency></code></code></code></code></code></code>

六、exclusions

依賴排除,就是有時候引入某一個依賴的時候,該依賴下有jar包沖突,可以排除掉,不引用該jar,例如:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <code><code><code><code><code><code> <dependency> <groupid>test</groupid> test</artifactid> <version>1.0.2-SNAPSHOT</version> <exclusions> <exclusion> <groupid>org.springframework</groupid> spring</artifactid> </exclusion> <exclusion> slf4j-log4j12</artifactid> <groupid>org.slf4j</groupid> </exclusion> </exclusions> </dependency></code></code></code></code></code></code>

maven的dependency參數