在Maven中的繼承與依賴傳遞
1、Maven中的繼承
在Maven中,子專案是可以繼承父專案中的依賴的,比如說我們有一個父專案maven-parent
,該父專案擁有一個子專案A,如果在父專案中依賴了junit
,那麼在子專案A中即便是沒有引入junit
,在子專案中仍然能夠使用junit
,因為子專案天然繼承了父專案中的junit
依賴。
為了更好的解釋說明,下面是我貼上的詳細程式碼:
父專案:maven-parent中的pom.xml
<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.lyc</groupId>
<artifactId>maven-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module >A</module>
</modules>
<packaging>pom</packaging>
<name>maven-parent</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>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
子專案A中的pom.xml
<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">
<parent>
<artifactId>maven-parent</artifactId>
<groupId>com.lyc</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>A</artifactId>
<packaging>jar</packaging>
<name>A</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
</dependencies>
</project>
通過上述程式碼,我們可以看到父專案中引入了junit
依賴,而子專案中並沒有引入,但是當我們檢視子專案的依賴結構圖時,我們卻清楚的檢視到了子專案A中含有junit
依賴,這說明子專案是從父專案中繼承了junit
依賴,如下圖所示:
2、Maven中的依賴傳遞
在Maven中,依賴是可以傳遞的,就是說假設存在三個專案,分別是專案A,專案B以及專案C,假設C依賴於B,B依賴於A,那麼我們可以根據Maven專案依賴的特徵不難推出專案C也依賴於A。
為了更好的解釋說明,下面是我貼上的詳細程式碼:
專案A中的pom.xml
<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">
<parent>
<artifactId>maven-parent</artifactId>
<groupId>com.lyc</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>A</artifactId>
<packaging>jar</packaging>
<name>A</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
</dependencies>
</project>
專案B中的pom.xml
<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">
<parent>
<artifactId>maven-parent</artifactId>
<groupId>com.lyc</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>B</artifactId>
<packaging>jar</packaging>
<name>B</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.lyc</groupId>
<artifactId>A</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
專案C中的pom.xml
<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">
<parent>
<artifactId>maven-parent</artifactId>
<groupId>com.lyc</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>C</artifactId>
<packaging>jar</packaging>
<name>C</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.lyc</groupId>
<artifactId>B</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
通過上述程式碼,我們可以得出,專案B依賴於專案A,通過檢視專案B的依賴結構圖,我們也可以檢視到相應的結果。
專案C依賴於專案B,而專案B又依賴於專案A,於是我們不難推出,專案C也就依賴於專案A,從專案C的依賴結構圖中我們也可以檢視到相同的結果。
從Java程式碼的呼叫上也可以說明這一點。
假如說我們在專案A中寫上如下程式碼:
package com.lyc;
public class Say {
public String say(){
return "A";
}
}
在專案A的測試程式碼部分,我們寫下如下程式碼:
package com.lyc;
import org.junit.Test;
public class SayTest {
@Test
public void test(){
Say say = new Say();
System.out.println(say.say());
}
}
當我們執行專案A中的SayTest中的方法時,控制檯中列印的就是專案A中的類Say中的方法say(),此時在控制檯中輸出的資訊是“A”。
然後我們將SayTest分別複製到專案B,與專案C中。我們知道,專案B與專案C中並沒有引入Say類,假如說我們執行專案B與專案C中的SayTest類,而這些結果都同時輸出“A”,則進一步驗證了專案B與專案C共同依賴了專案A,這也就進一步驗證了依賴是可以傳遞的。
在專案B,中輸出的結果:“A”
在專案C,中輸出的結果:“A”
這說明我們上面的判斷是正確的。
下面是專案中的原始碼,連結如下: