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

愛撒謊的男孩發表於2020-11-09

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

目錄

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

前言

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

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

其實玩轉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,它的子模組將不會執行相關操作。

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

總結

隨著專案的體量逐漸增長,可不止上面的幾個模組,學會以上幾個命令,提升的效率可不止一倍啊。

相關文章