[Maven實戰](9)傳遞性依賴
這麽做往往就引入了非常多不必要的依賴。還有一種做法是僅僅下載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項目依賴,自己加入到我們的項目中。
|
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 |
細致觀察上面表格,我們發現這種規律:
|
來源於:《Maven實戰》
[Maven實戰](9)傳遞性依賴