一次打包引發的思考,原來maven還能這麼玩?
- 2020 年 11 月 9 日
- 筆記
- JAVA, springboot, 碼猿技術專欄
持續原創輸出,點擊上方藍字關注我

目錄
-
前言 -
依賴關係 -
你會怎麼做? -
必知的幾個參數 -
總結
前言
昨天有一個讀者找我的交流工作心得,偶然間提到一個有趣的問題,如下:
「大致的意思」:公司最近在整多模塊
開發,由於模塊之間相互依賴,每次打包都很煩,必須根據依賴關係逐一進行打包,有沒有省事的辦法呢?
其實玩轉Maven
的朋友都知道,只需要一條命令即可解決問題。
依賴關係
假設有一個多模塊項目,父工程P
中含有三個子模塊A
、B
、C
,三個模塊有如下的依賴關係:
-
A
依賴B
、C
。 -
B
依賴C
。

父工程P
的pom.xml
如下:
.....
<modules>
<module>A</module>
<module>B</module>
<module>C</module>
</modules>
.....
A
模塊的pom.xml
如下:
....
<dependency>
<groupId>xxx.xxxx</groupId>
<artifactId>B</artifactId>
<version>xxxx</version>
</dependency>
.....
B
模塊的pom.xml
如下:
....
<dependency>
<groupId>xxx.xxxx</groupId>
<artifactId>C</artifactId>
<version>xxxx</version>
</dependency>
.....
C
模塊的pom.xml
如下:
....
你會怎麼做?
現在產品需要上線項目A
,你該如何打包?
最容易想到的則是分開打包,分別執行如下的命令:
mvn clean install C
mvn clean install B
mvn clean package A
以上三個模塊輪流打包,至少需要五分鐘以上吧,你不慌嗎?

重點來了,我只需要如下一條命令即可打包完成:
mvn clean package -pl A -am -P test -DskipTests=true
以上命令有什麼高深的嗎?-P
指定環境,-DskipTests=true
跳過測試,但是-pl
和-am
是什麼?
答案肯定是在-pl
和-am
這兩個參數了。
必知的幾個參數
從以上的例子中可以知道重要的就是-pl
和-am
這兩個參數,那麼是什麼意思呢?如下:
參數 | 說明 |
---|---|
-pl |
可選,指定需要處理的工程,多個使用英文逗號分隔,取值是artifactId |
-am | 可選,同時處理 pl參數 指定模塊的依賴模塊 |
-amd | 可選,同時處理依賴於 pl參數 指定模塊的模塊 |
-N | 可選,表示不遞歸子模塊 |
怎麼樣,理解了嗎?是不是有點晦澀難懂,哈哈….

別著急,下面通過幾個命令理解一下(全部在父工程P
的根目錄下執行)。
-
mvn clean install -pl A -am
對父工程P
、子模塊A
以及A
模塊依賴的B
、C
模塊執行mvn clean install
操作。
這個命令執行成功後,可以看到P
、A
、B
、C
四個模塊全部安裝到本地了。
-
mvn clean install -pl C -am
對父工程P
、子模塊C
模塊執行mvn clean install
操作。
這個命令執行成功後,可以看到P
、C
兩個模塊安裝到本地。
由於
C
模塊「不依賴」其他的兩個子模塊,因此A
、B
模塊不會執行相關命令。
-
mvn clean install -pl C -amd
對父工程P
、子模塊C
以及依賴於C
模塊的B、
C模塊執行
mvn clean install`操作。
這個命令執行成功後,可以看到P
、A
、B
、C
四個模塊全部安裝到本地了。
-
mvn clean install -N
只會打包父工程P
,它的子模塊將不會執行相關操作。
怎麼樣?通過以上的命令應該理解了吧。
總結
隨着項目的體量逐漸增長,可不止上面的幾個模塊,學會以上幾個命令,提升的效率可不止一倍啊。
