Apache Maven依賴傳遞

Apache Maven依賴傳遞控制

前言

在實際的執行中大型專案的過程當中,通常不會使用單一專案來建構整個專案,而是依照不同需求或場景將專案拆成好幾個子專案,這時會將共用項目獨立出來,供給其他專案引入依賴,而有一些套件已經在共用項目中已經引用了dependency,其他專案引用共用項目的專案,也會一併引用其專案依賴,也就是說可以將其他專案也都會用到的dependency一併加入至共用項目專案,統一整合各子專案的dependency,如此一來就方便許多。

在傳遞依賴的過程當中,若想讓某些套件向下傳遞可透過optional標籤進行設定,而下方依賴的專案亦可透過exclusions排除上方傳遞下來的依賴。而控制好傳遞依賴,可以有效免除套件衝突,只提原套件功能出去,也可以讓套件依賴關係更為清晰。

實作

楊藝這邊是用自己的私人專案結果進行展示。以下是一個Common套件專案,統一提供給依賴專案,共用功能,目前此專案的依賴如下,因內部提供了有關Excel操作的Util,不得不引用POI套件,但並非所有專案都需要操作Excel,需要使用到POI套件,因此楊藝在這邊將它設定成不像下傳遞。若下方套件需要使用到POI套件,再自行在自己的pom.xml引入。

common專案pom.xml檔

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<?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>
    <artifactId>common</artifactId>

    <parent>
        <groupId>cc.artyang</groupId>
        <artifactId>j-project-tools</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-collections4</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>commons-beanutils</groupId>
            <artifactId>commons-beanutils</artifactId>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>

    <properties>
        <maven.compiler.source>21</maven.compiler.source>
        <maven.compiler.target>21</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

</project>

楊藝又拆分了一個專門進行資料持久化相關的專案,裡面引用了common專案。

persistent專案pom.xml檔

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?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>

    <artifactId>persistent</artifactId>

    <parent>
        <groupId>cc.artyang</groupId>
        <artifactId>j-project-tools</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <properties>
        <maven.compiler.source>21</maven.compiler.source>
        <maven.compiler.target>21</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>commons-dbutils</groupId>
            <artifactId>commons-dbutils</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-dbcp2</artifactId>
        </dependency>
        <dependency>
            <groupId>cc.artyang</groupId>
            <artifactId>common</artifactId>
            <optional>true</optional>
            <exclusions>
                <exclusion>
                    <groupId>commons-io</groupId>
                    <artifactId>commons-io</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>commons-beanutils</groupId>
                    <artifactId>commons-beanutils</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

</project>

這邊楊藝使用查看目前專案依賴的指令,可以查看直接依賴或是傳遞性依賴

1
 mvn dependency:list

顯示結果

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[INFO] Scanning for projects...
[INFO]
[INFO] -----------------------< cc.artyang:persistent >------------------------
[INFO] Building persistent 1.0-SNAPSHOT
[INFO]   from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- dependency:3.7.0:list (default-cli) @ persistent ---
[INFO]
[INFO] The following files have been resolved:
[INFO]    commons-dbutils:commons-dbutils:jar:1.8.1:compile -- module org.apache.commons.dbutils
[INFO]    org.apache.commons:commons-dbcp2:jar:2.13.0:compile -- module org.apache.commons.dbcp2
[INFO]    org.apache.commons:commons-pool2:jar:2.12.0:compile -- module org.apache.commons.pool2
[INFO]    commons-logging:commons-logging:jar:1.3.4:compile -- module org.apache.commons.logging
[INFO]    jakarta.transaction:jakarta.transaction-api:jar:1.3.3:compile -- module java.transaction [auto]
[INFO]    cc.artyang:common:jar:1.0-SNAPSHOT:compile (optional) -- module common (auto)
[INFO]    org.apache.commons:commons-collections4:jar:4.5.0-M3:compile (optional) -- module org.apache.commons.collections4
[INFO]    org.apache.commons:commons-lang3:jar:3.17.0:compile (optional) -- module org.apache.commons.lang3
[INFO]    org.projectlombok:lombok:jar:1.18.36:compile (optional) -- module lombok
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.958 s
[INFO] Finished at: 2025-02-18T12:34:29+08:00
[INFO] ------------------------------------------------------------------------

上方common專案pom專案透過<optional>true</optional>設定排除poi、poi-ooxml依賴向下傳遞,而persistent專案依賴common專案,但不需使用commons-io與commons-beanutils套件,因此透過 <exclusions></exclusions>排除依賴,因此在persistent專案下使用Maven指令查看依賴關係,並不會看到以上四個套件。