前言
在實際的執行中大型專案的過程當中,通常不會使用單一專案來建構整個專案,而是依照不同需求或場景將專案拆成好幾個子專案,這時會將共用項目獨立出來,供給其他專案引入依賴,而有一些套件已經在共用項目中已經引用了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
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指令查看依賴關係,並不會看到以上四個套件。