Maven的依賴
說說Maven的依賴。
依賴類型
Maven會用到的依賴基本就是5種,compile,test,provided,runtime,system
1.compile:編譯依賴范圍,默認使用該范圍。編譯、測試、運行都有效
2.test:測試依賴范圍。支隊測試的classpath有效。例如Junit,greenMail。
3.provided:對編譯和測試有效,對運行無效,常用于容器提供了的運行環境。例如servlet-api,容器以提供,所以只需要編譯和測試有效即可。
4.runtime:運行時依賴范圍。例如jdbc驅動,編譯和測試并不需要,只需要使用JDK提供的JDBC接口即可。
5.system:系統依賴范圍,依賴Maven倉庫意外的依賴。
例如
<dependencies>
<dependency>
<groupId>javax.sql</groupId>
<artifactId>jdbc-stdext</artifactId>
<version>2.0</version>
<scope>system</scope>
<systemPath>${java.home}/lib/rt.jar</systemPath>
</dependency>
</dependencies>
依賴的傳遞
項目中,其實經常會出現這種情況,應用了某個Jar包,然后使用時候報錯缺少某個類,這就是因為缺少了該jar包所依賴的jar包的原因。例如工程A依賴了,spring-core,spring-core依賴commons-logging,那A依賴spring-core時候依舊傳遞的依賴了commons-logging。
##傳遞依賴的范圍
假設A依賴B,B依賴C,我們說A對于B是第一直接依賴,B對于C是第二直接依賴,A對于C是傳遞性依賴。第一直接依賴的范圍和第二直接依賴的范圍決定了傳遞性依賴的范圍,如下圖,最左邊一列表示第一直接依賴范圍,最上面一行表示第二直接依賴范圍,中間交叉單元格表示傳遞性依賴范圍。
Tables |
compile |
test |
provided |
runtime |
</tr>
------------- |
:-------------: |
-----: |
:-------------: |
--------: |
</tr>
compile |
compile |
X |
X |
runtime |
</tr>
test |
test |
X |
X |
test |
</tr>
provided |
provided |
X |
provided |
provided |
</tr>
runtime |
runtime |
X |
X |
runtime |
</tr>
</tbody>
</table>
注意:X代表不依賴
依賴沖突的調解
有兩個原則,第一原則是路徑短優先原則,第二原則是先聲明者優先
##路徑短優先原則
依賴調解的第一原則是:路徑最近者優先。
A ->B->C->X(1.0)
A ->D->X(2.0)
這樣A會傳遞性依賴X(2.0)
##先聲明者優先原則
賴調解的第二原則是:先聲明者優先。
當路徑長度相同時候,第一原則已經不能解決問題了,Maven2.0.9以后版本就有了第二原則,聲明在先者有效。
A ->C->X(1.0)
A ->D->X(2.0)
這樣A傳遞性依賴了X(1.0),因為他是先聲明的。
可選依賴
可選依賴不被傳遞。例如下例,B有一個持久層工具包依賴,他依賴了兩種數據庫驅動,這兩種特性只需要選擇一種,這種傳遞性依賴是不會給傳遞的,需要在A項目中另外依賴數據庫驅動依賴。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.10</version>
<option>true</option>
</dependency>
<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>8.4.701.jdbc3</version>
<option>true</option>
</dependency>
正常情況不應該使用可選依賴,可選依賴一般是項目有多個特性,在面向對象設計中單一原則意指一個類應該只有一項職責。
排除依賴
有的時候傳遞性依賴的依賴包還處于不穩定版本,或者傳遞性依賴包因為版權問題不存在于中央倉庫,這時候需要引入其他等價的依賴包。
所以需要排除依賴,然后自己在配置文件中再引入相應的依賴包。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>2.5.6</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId> commons-logging </groupId>
<artifactId> commons-logging </artifactId>
<version>1.1.0</version>
</dependency>
歸類依賴
有時候,像Spring框架,當更新依賴時候,需要更新一片的依賴關系,這時候一個一個去修改過于麻煩,不如定義一個常量,更新時候手動修改一個就好了。
可以在pom.xml文件中的project標簽下,定義
<properties>
<springframework.version>2.5.6</ springframework.version>
</ properties>
然后引入依賴時候,在version 中使用 ${ springframework.version }即可。
依賴優化
##依賴列表
mvn dependency:list命令可以列出當前所有依賴(包括直接和傳遞)的列表,以及范圍。
##依賴樹
mvn dependency:tree命令可以層次化的列出所有依賴,可以從書中看出依賴傳遞的關系。
##依賴分析
mvn dependency:analyze命令可以分析當前依賴,包括哪些依賴被import卻沒引入,哪些引來引入了但是沒加入編譯。有時候可以用來刪除一些沒用的依賴,但是不能直接刪除,比如sprint-core是Spring的必須依賴,但是會提示沒加入編譯,但是他又是Spring框架必須的。
Unused declared dependencies 后的內容 : 項目中未使用的,但顯示聲明的依賴
Used undeclared dependencies 后的內容:項目中使用到的,但是沒有顯示聲明的依賴。
本文由用戶
jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!
sesese色