一次打包引發的思考,原來maven還能這麼玩?

持續原創輸出,點擊上方藍字關注我

目錄

  • 前言
  • 依賴關係
  • 你會怎麼做?
  • 必知的幾個參數
  • 總結

前言

昨天有一個讀者找我的交流工作心得,偶然間提到一個有趣的問題,如下:

大致的意思:公司最近在整多模塊開發,由於模塊之間相互依賴,每次打包都很煩,必須根據依賴關係逐一進行打包,有沒有省事的辦法呢?

其實玩轉Maven的朋友都知道,只需要一條命令即可解決問題。

依賴關係

假設有一個多模塊項目,父工程P中含有三個子模塊ABC,三個模塊有如下的依賴關係:

  1. A 依賴 BC
  2. B 依賴 C
依賴關係圖
依賴關係圖

父工程Ppom.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 可選,表示不遞歸子模塊

怎麼樣,理解了嗎?是不是有點晦澀難懂,哈哈….

what?
what?

別著急,下面通過幾個命令理解一下(全部在父工程P的根目錄下執行)。

  1. mvn clean install -pl A -am

對父工程P、子模塊A以及A模塊依賴的BC模塊執行mvn clean install操作。

這個命令執行成功後,可以看到PABC四個模塊全部安裝到本地了。

  1. mvn clean install -pl C -am

對父工程P、子模塊C模塊執行mvn clean install操作。

這個命令執行成功後,可以看到PC兩個模塊安裝到本地。

由於C模塊不依賴其他的兩個子模塊,因此AB模塊不會執行相關命令。

  1. mvn clean install -pl C -amd

對父工程P、子模塊C以及依賴於C模塊的BC模塊執行mvn clean install`操作。

這個命令執行成功後,可以看到PABC四個模塊全部安裝到本地了。

  1. mvn clean install -N

只會打包父工程P,它的子模塊將不會執行相關操作。

怎麼樣?通過以上的命令應該理解了吧。

總結

隨着項目的體量逐漸增長,可不止上面的幾個模塊,學會以上幾個命令,提升的效率可不止一倍啊。