1. 程式人生 > >在Maven中的繼承與依賴傳遞

在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”

  這說明我們上面的判斷是正確的。

  下面是專案中的原始碼,連結如下: