從失敗的地方開始 Maven 構建
1. 概述
在本教程中,我們將學習如何在失敗後恢復 Maven 構建。我們將看到如何跳過已經成功構建的模塊。因此,我們將直接跳到問題出現的地方。
2. 設置示例
讓我們構建一個多模塊 Maven 項目。我們將父級簡歷稱為resume-from
,將兩個子級稱為lib
”和business
。為了演示,我們將lib
項目留空。但是, business
項目包含一個單獨的src/main/java/Main.java
文件,其中包含Hello World
。現在讓我們在business
模塊中添加對lib
依賴:
<dependency>
<groupId>com.baeldung</groupId>
<artifactId>lib</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
到目前為止,項目的內容是正確的,因此我們可以成功構建它:
$ mvn clean install
[...]
[INFO] Reactor Summary for resume-from 1.0-SNAPSHOT:
[INFO]
[INFO] resume-from ........................................ SUCCESS [ 1.749 s]
[INFO] lib ................................................ SUCCESS [ 2.021 s]
[INFO] business ........................................... SUCCESS [ 0.991 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[...]
3. 運行install
階段時
現在讓我們刪除Main.java
文件中的分號。這破壞了business
子模塊的構建:
$ mvn clean install
[...]
[INFO] Reactor Summary for resume-from 1.0-SNAPSHOT:
[INFO]
[INFO] resume-from ........................................ SUCCESS [ 1.186 s]
[INFO] lib ................................................ SUCCESS [ 0.984 s]
[INFO] business ........................................... FAILURE [ 0.334 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.809 s
[INFO] Finished at: 2023-06-20T16:15:13+02:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project business: Compilation failure
[ERROR] [...]/resume-from/business/src/main/java/Main.java:[4,43] ';' expected
[...]
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR] mvn <args> -rf :business
由於lib
模塊已成功構建,因此在解決問題後最好跳過其構建。正如 Maven 的錯誤消息中所述,我們可以使用-rf
選項從給定模塊恢復反應器。讓我們修復Main.java
文件並嘗試以下操作:
$ mvn clean install -rf :business
[INFO] Scanning for projects...
[INFO]
[INFO] -----------------------< com.baeldung:business >------------------------
[INFO] Building business 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[...]
------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.318 s
[INFO] Finished at: 2023-06-20T17:21:07+02:00
[INFO] ------------------------------------------------------------------------
果然,這次只搭建了business
子模塊。實際上, -rf
是 –resume-from 的簡短版本,因此我們可以等效地編寫:
$ mvn clean install --resume-from :business
4. 未運行時install
現在假設我們不運行 Maven install
,而是在早期階段停止構建。為了展示這一點,我們可以回到Main.java
文件損壞的情況。我們還清理本地存儲庫並運行package
階段:
$ mvn clean package
[...]
[INFO] Reactor Summary for resume-from 1.0-SNAPSHOT:
[INFO]
[INFO] resume-from ........................................ SUCCESS [ 0.108 s]
[INFO] lib ................................................ SUCCESS [ 0.709 s]
[INFO] business ........................................... FAILURE [ 0.316 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.216 s
[INFO] Finished at: 2023-06-20T17:49:59+02:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project business: Compilation failure
[ERROR] [...]/resume-from/business/src/main/java/Main.java:[4,43] ';' expected
[...]
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR] mvn <args> -rf :business
不出所料,我們得到了相同的編譯錯誤。錯誤消息為我們提供了在解決問題後使用-rf
選項的相同提示。因此,讓我們解決問題並運行以下命令:
$ mvn clean package -rf :business
[INFO] Scanning for projects...
[INFO]
[INFO] -----------------------< com.baeldung:business >------------------------
[INFO] Building business 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[WARNING] The POM for com.baeldung:lib:jar:1.0-SNAPSHOT is missing, no dependency information available
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.187 s
[INFO] Finished at: 2023-06-20T17:56:34+02:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal on project business: Could not resolve dependencies for project com.baeldung:business:jar:1.0-SNAPSHOT: Could not find artifact com.baeldung:lib:jar:1.0-SNAPSHOT -> [Help 1]
由於我們沒有運行install
階段,因此在第一次構建期間lib
子模塊沒有安裝在我們的本地存儲庫中。因此,Maven 在嘗試恢復構建時無法找到lib
工件。理論上,我們可以通過在命令行中添加–also-make
選項來解決這個問題。使用–also-make
,Maven 應該構建business
依賴的所有項目。然而,Maven 3 中有一個 bug,與–resume-from
結合使用時–also-make
會被忽略。
該錯誤將在 Maven 4 中修復,目前仍在開發中。同時,在這種情況下我們無法從特定模塊恢復反應器。不幸的是,我們需要重做整個構建:
$ mvn clean package
[...]
[INFO] Reactor Summary for resume-from 1.0-SNAPSHOT:
[INFO]
[INFO] resume-from ........................................ SUCCESS [ 0.109 s]
[INFO] lib ................................................ SUCCESS [ 0.660 s]
[INFO] business ........................................... SUCCESS [ 0.436 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[...]
5. 結論
在本文中,我們了解瞭如何在 Maven 構建失敗後跳過部分內容。當我們將子模塊安裝到本地存儲庫時,我們可以使用-rf
選項。另一方面,不安裝它們會導致由於 Maven 錯誤而需要重做整個構建。
與往常一樣,代碼可以在 GitHub 上獲取。