maven多模塊項目依賴管理與依賴繼承詳解

maven多模塊項目依賴管理與依賴繼承

1、指定父模塊與默認繼承

dependencies即使在子項目中不寫該依賴項,那麼子項目仍然會從父項目中繼承該依賴項(全部繼承)

父模塊的pom

<?xml version="1.0" encoding="UTF-8"?>
<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.zhangguo.maven03</groupId>
    <artifactId>Maven03</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>Maven03-Dao</module>
        <module>Maven03-Service</module>
    </modules>
    <properties>
        <junit.version>4.12</junit.version>
        <spring.version>RELEASE</spring.version>
    </properties>
        <dependencies>
            <!-- junit -->
            <!-- https://mvnrepository.com/artifact/junit/junit -->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
</project>

子模塊的pom

<?xml version="1.0" encoding="UTF-8"?>
<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>Maven03</artifactId>
        <groupId>com.zhangguo.maven03</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>Maven03-Dao</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>${spring.version}</version>
            <!--版本是從父模塊依賴過來的properties-->
        </dependency>
    </dependencies>
</project>

RELEASE表示最新的發佈版本,結果如下:

2、依賴管理

dependencyManagement裡隻是聲明依賴,並不實現引入,因此子項目需要顯式的聲明需要用的依賴。如果不在子項目中聲明依賴,是不會從父項目中繼承下來的;隻有在子項目中寫瞭該依賴項,並且沒有指定具體版本,才會從父項目中繼承該項,並且version和scope都讀取自父pom;另外如果子項目中指定瞭版本號,那麼會使用子項目中指定的jar版本。

當我把父項目中的依賴放到依賴管理中的效果如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<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.zhangguo.maven03</groupId>
    <artifactId>Maven03</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>Maven03-Dao</module>
        <module>Maven03-Service</module>
    </modules>
    <properties>
        <junit.version>4.12</junit.version>
        <spring.version>RELEASE</spring.version>
    </properties>
    <!--dependencyManagement裡隻是聲明依賴,並不實現引入,
    因此子項目需要顯式的聲明需要用的依賴。
    如果不在子項目中聲明依賴,是不會從父項目中繼承來的;
    隻有在子項目中寫瞭該依賴項,並且沒有指定具體版本,才會從父項目中繼承該項,
    並且version和scope都讀取自父pom;
    另外如果子項目中指定瞭版本號,那麼會使用子項目中指定的jar版本。-->
    <dependencyManagement>
        <dependencies>
            <!-- junit -->
            <!-- https://mvnrepository.com/artifact/junit/junit -->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    
</project>

結果

這裡的父模塊與子模塊都並沒有依賴junit瞭,這時的依賴隻是用於管理,並沒有真正依賴。

<dependencyManagement>元素既能讓子模塊繼承到父模塊的依賴配置,又能保證子模塊依賴使用的靈活性。

使用<dependencyManagement>聲明的依賴即不會引入依賴,也不會給他的子模塊引入依賴。但這段配置是可以繼承的。

在子類中,依賴配置較原來就簡單瞭。可以在子類中隻配置groupId和artifactId ,省去瞭version。因為完整的依賴聲明已經包含在父POM中。 這樣可以統一項目范圍中依賴的版本,幫助降低依賴沖突的幾率。如果子模塊不聲明依賴的使用,即使該依賴已經在父POM的dependencyManangement中聲明瞭,也不會產生任何實際的效果。

如果想要在某個模塊中使用和另一個模塊中完全一樣的dependencyManagement配置,除瞭賦值和繼承外,還可以使用import范圍依賴將這一配置導入。

我們要達到的目的是:父模塊作版本管理不實際依賴,子模塊按需依賴。

父模塊pom

<?xml version="1.0" encoding="UTF-8"?>
<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.zhangguo.maven03</groupId>
    <artifactId>Maven03</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>Maven03-Dao</module>
        <module>Maven03-Service</module>
    </modules>
    
    <!--版本管理-->
    <properties>
        <junit.version>4.12</junit.version>
        <spring.version>RELEASE</spring.version>
    </properties>
    <!--依賴聲明-->
    <dependencyManagement>
        <dependencies>
            <!-- junit -->
            <!-- https://mvnrepository.com/artifact/junit/junit -->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

子模塊pom:

<?xml version="1.0" encoding="UTF-8"?>
<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>Maven03</artifactId>
        <groupId>com.zhangguo.maven03</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>Maven03-Service</artifactId>
    <dependencies>
        <!--按需依賴,版本被父模塊控制,可以自行聲明,優先級更高-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
    </dependencies>
</project>

結果:

這樣做的好處:統一管理項目的版本號,確保應用的各個項目的依賴和版本一致,才能保證測試的和發佈的是相同的成果,因此,在頂層pom中定義共同的依賴關系。

同時可以避免在每個使用的子項目中都聲明一個版本號,這樣想升級或者切換到另一個版本時,隻需要在父類容器裡更新,不需要任何一個子項目的修改;如果某個子項目需要另外一個版本號時,隻需要在dependencies中聲明一個版本號即可。子類就會使用子類聲明的版本號,不繼承於父類版本號。

關於maven項目依賴繼承問題

在Maven中,子項目是可以繼承父項目的依賴的。

需要在父項目中加入

<modules>
   <module>childA</module>
   <module>childB</module>
</modules>

把父項目已POM的形式

打包到maven庫中 (*部分必須要有)

<modelVersion>4.0.0</modelVersion>  
<groupId>com.sang.main</groupId>              *
<artifactId>Parent-Moduel</artifactId>         *
<version>1.0.2</version>            *
<packaging>pom</packaging>  
<name>Simple-main</name>

在子項目中以<parent>標簽

繼承父項目即可。

<parent>
   <groupId>com.sang.main</groupId>
   <artifactId>Parent-Moduel</artifactId>
   <version>1.0.2</version>
</parent>

如果是父項目中的直接依賴,在子項目中什麼都不用寫,就會自動繼承;

如果是父項目中<dependencyManagement>標簽下的依賴,可以有選擇性的繼承,這個時候要自己在子項目添加依賴,需要有<groupId>和<artifactId>,但是版本就可以省略,直接繼承父項目。 這樣一來,我們就可以隻繼承父項目中我們需要的,而不是一股腦全部繼承。

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: