maven中scope
前言
最近在做itoo的pom優化工作,發現對於maven依賴管理中的scope標籤還是有不明白的地方,所以今天就來總結一下這方面的知識,scope在maven的依賴管理中主要負責專案的部署
maven的哲學在上次技術分享的時候也提到了:約定大於配置,所以在maven中,很多內容都有預設值,scope的預設值是compile,那麼scope還能有哪些選項呢?
scope的分類
1.compile:預設值 他表示被依賴專案需要參與當前專案的編譯,還有後續的測試,執行週期也參與其中,是一個比較強的依賴。打包的時候通常需要包含進去
2.test:依賴專案僅僅參與測試相關的工作,包括測試程式碼的編譯和執行,不會被打包,例如:junit
3.runtime:表示被依賴專案無需參與專案的編譯,不過後期的測試和執行週期需要其參與。與compile相比,跳過了編譯而已。例如JDBC驅動,適用執行和測試階段
4.provided:打包的時候可以不用包進去,別的設施會提供。事實上該依賴理論上可以參與編譯,測試,執行等週期。相當於compile,但是打包階段做了exclude操作
5.system:從參與度來說,和provided相同,不過被依賴項不會從maven倉庫下載,而是從本地檔案系統拿。需要新增systemPath的屬性來定義路徑
scope的依賴傳遞
A依賴B,B依賴C。當前專案為A,只當B在A專案中的scope,那麼c在A中的scope是如何得知呢?
當C是test或者provided時,C直接被丟棄,A不依賴C;(排除傳遞依賴)
否則A依賴C,C的scope繼承與B的scope
ITOO例項
在優化過程中,我們把core和web中的一部分依賴,加上了scope標籤,也就是說,避免了最後打包階段把一些可以從ear中已經提供的包排除在外,去掉重複的打包過程
core的pom檔案
<dependencies>
<dependency>
<groupId>com.dynamic</groupId>
<artifactId>itoo-base</artifactId >
<type>ejb</type>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.dynamic</groupId>
<artifactId>itoo-cloud-api</artifactId>
<scope>provided</scope>
<type>ejb</type>
</dependency>
<dependency>
<groupId>com.dynamic</groupId>
<artifactId>itoo-tool</artifactId>
<scope>provided</scope>
<type>ejb</type>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
</dependency>
<dependency>
<groupId>com.dynamic</groupId>
<artifactId>itoo-authority-api</artifactId>
<scope>provided</scope>
<type>ejb</type>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</dependency>
<dependency>
<groupId>com.dynamic</groupId>
<artifactId>itoo-basic-api</artifactId>
<scope>provided</scope>
<type>ejb</type>
</dependency>
</dependencies>