1. 程式人生 > >[Maven實戰](9)傳遞性依賴

[Maven實戰](9)傳遞性依賴

cin jar ace wid cti div track 手動 local

了解Spring的朋友都知道。創建一個Spring Framework項目都須要依賴什麽樣的Jar包。假設不使用Maven,那麽在項目中就須要手動下載相關的依賴。因為Spring Framework又會依賴與其它開源類庫,因此實際中往往會下載Spring Framework的jar包。還的下載全部它依賴的其它jar包。

這麽做往往就引入了非常多不必要的依賴。還有一種做法是僅僅下載Spring Framework的jar包。不包括其它的相關依賴,到實際使用的時候。再依據報錯信息。或者查詢相關文檔,增加須要的其它依賴。

這麽做讓我們非常不舒服。
1. 傳遞性依賴
Maven的傳遞性依賴機制能夠非常好的解決這一問題。我們還是以HelloWorld項目為例。

我們能夠從Eclipse創建Spring-HelloWorld項目過程與Maven創建Spring-HelloWorld項目過程看出區別來:
(1)Eclipse創建Spring-HelloWorld項目: 對於使用Spring2.xxx,我們須要下載spring-2.5.6.jar;對於Spring3.xxx,我們須要下載spring-context-4.2.4.RELEASE.jar。spring-core-4.2.4.RELEASE.jar。

除此之外,我們還的下載Spring Framework所依賴的其它的jar:commons-logging-1.2.jar。

(2)Maven創建Spring-HelloWorld項目: 可是使用Maven方式我們僅僅須要知道Sring Framework的jar就可以。不須要知道其所須要commons-logging等jar包。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
>
<modelVersion>4.0.0</modelVersion> <groupId>com.sjf.springdemo</groupId> <artifactId>springdemo-helloworld</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>springdemo-helloworld</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring</artifactId> <version>2.5.6</version> </dependency> </dependencies></project>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  <modelVersion>4.0.0</modelVersion>   <groupId>com.sjf.springdemo</groupId>  <artifactId>springdemo-helloworld</artifactId>  <version>0.0.1-SNAPSHOT</version>  <packaging>jar</packaging>   <name>springdemo-helloworld</name>  <url>http://maven.apache.org</url>   <properties>	<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  </properties>   <dependencies>    <dependency>      <groupId>junit</groupId>      <artifactId>junit</artifactId>      <version>3.8.1</version>      <scope>test</scope>    </dependency>        <dependency>      <groupId>org.springframework</groupId>      <artifactId>spring-context</artifactId>      <version>4.2.4.RELEASE</version>    </dependency>        <dependency>      <groupId>org.springframework</groupId>      <artifactId>spring-core</artifactId>      <version>4.2.4.RELEASE</version>    </dependency>  </dependencies></project>

其以上代碼是項目配置的依賴,從上面能夠看出我們僅僅依賴了Spring Framework的jar,並沒有依賴commons-logging。
可是我們從Maven項目上看到Maven的依賴:
Spring2.xxx 技術分享

技術分享
Spring3.xxx 技術分享
技術分享

從上面能夠看出我們盡管僅僅依賴了Spring Framework的jar,並沒有依賴其它類庫的jar,可是項目還是出現了其它的jar。這就是傳遞性依賴的作用。


下圖是上面實例項目的依賴演示圖:
技術分享技術分享

那究竟什麽是傳遞性依賴呢?

傳遞性依賴是在maven2中加入的新特征,這個特征的作用就是你不須要考慮你依賴的庫文件所須要依賴的庫文件,可以將依賴模塊的依賴自己主動的引入。
比如我們依賴於spring的庫文件,可是spring本身也有依賴。假設沒有傳遞性依賴那就須要我們了解spring項目依賴,自己加入到我們的項目中。


有了傳遞性依賴機制,在使用Spring Framework的時候就不用去考慮它依賴了什麽,也不用操心引入多余的依賴。Maven會解析各個直接依賴的POM。將那些必要的間接依賴,以傳遞性依賴的形式引入到當前的項目中。
2.傳遞性依賴與依賴範圍
依賴範圍不僅能夠控制依賴與三種classpath的關系,還對傳遞性依賴產生影響。

上面樣例中。springdemo-helloworld對於spring-core的依賴範圍是compile,spring-core對於commons-logging的依賴範圍是compile,那麽springdemo-helloworld對於commons-logging這一傳遞性依賴的範圍也就是compile。

如果A依賴於B。B依賴於C。我們說A對於B是第一直接依賴,B對C是第二直接依賴,A對於C是傳遞性依賴第一直接依賴的範圍第二直接依賴的範圍決定了傳遞性依賴的範圍


最左邊一行表示第一直接依賴範圍。最上面一行表示第二直接依賴範圍。中間的交叉單元格則表示傳遞性依賴範圍。
compile test provided runtime
compile compile --- --- runtime
test test --- --- test
provided provided --- provided provided
runtime runtime --- --- runtime

細致觀察上面表格,我們發現這種規律:

  • 當第二直接依賴的範圍是compile的時候。傳遞性依賴的範圍與第一直接依賴的範圍一致
  • 當第二直接依賴的範圍是test的時候,依賴不會得以傳遞
  • 當第二直接依賴的範圍是provided的時候,僅僅傳遞第一直接依賴的範圍也為provided的依賴,切傳遞性依賴的範圍相同為provided
  • 當第二直接依賴的範圍是runtime的時候,傳遞性依賴的範圍與第一直接依賴的範圍一致,但compile例外,此時傳遞性依賴的範圍為runtime





來源於:《Maven實戰》



[Maven實戰](9)傳遞性依賴