我install
我的Maven項目:爲什麼Maven在JAR已經存在的時候再次運行測試?
mvn clean install
一切工作正常,在/target
目錄中創建JAR文件。現在我再次運行它:
mvn install
Maven的重新執行單元測試和靜態代碼分析。我沒有對.java
文件進行任何更改,並且JAR在那裏,那麼爲什麼要再次運行測試呢?我做錯了什麼或者它是如何設計的?
我install
我的Maven項目:爲什麼Maven在JAR已經存在的時候再次運行測試?
mvn clean install
一切工作正常,在/target
目錄中創建JAR文件。現在我再次運行它:
mvn install
Maven的重新執行單元測試和靜態代碼分析。我沒有對.java
文件進行任何更改,並且JAR在那裏,那麼爲什麼要再次運行測試呢?我做錯了什麼或者它是如何設計的?
現在我跑一遍(...)Maven運行單元測試,並再次
靜態代碼分析因爲這是你問什麼簡單的Maven做。
當您調用build phase時,Maven不僅會執行該構建階段,還會執行被調用構建階段之前的每個構建階段。因此,調用:
mvn install
運行前,每次構建階段install
(validate
,compile
,test
,package
等),執行install
,你也必然會這些階段的插件前。
儘管Maven確實支持Java源代碼的增量編譯,但其他插件並不那麼聰明,並且會再次被觸發。
現在,一些言論/建議:
install
,如果你沒有任何改變的地步?多模塊項目,具有廣泛的測試和靜態代碼分析。我運行
mvn clean install
,然後在一個模塊中更改一個單獨的java文件。然後我運行mvn install
,期望maven只測試/分析這個已更改的特定模塊。不幸的是,它重新測試並重新分析所有模塊。
事實上,如果你運行mvn install
作爲反應器構建的一部分,將運行在所有模塊和測試和分析mvn install
將再次上所有模塊。這可能不是你所期望的,但這就是你會得到的(AFAIK,靜態分析插件沒有意識到變化 - 我無法解釋爲什麼事情不會更好)。
需要這麼多時間。
我建議使用the advanced reactor options來構建模塊的一個子集。這些選項包括:
-rf, --resume-from
Resume reactor from specified project
-pl, --projects
Build specified reactor projects instead of all projects
-am, --also-make
If project list is specified, also build projects required by the list
-amd, --also-make-dependents
If project list is specified, also build projects that depend on projects on the list
所以你的情況,你可以運行像(假設你感動module-foo
):
mvn -pl module-foo,my-packaged-app install
,或者重建依賴於module-foo
所有項目:
mvn -pl module-foo -amd install
不幸的是,這是如何設計maven install
插件。它執行最佳實踐,比如在安裝之前始終運行測試,因爲即使代碼沒有,其他環境因素也可能發生變化。
如果你只是想以增量編譯(即只有自上次編譯後更改過的那些文件),那麼你應該通過調用mvn compile
使用compiler
插件,然後建立罐子使用mvn jar:jar
。
跳過測試:mvn -Dmaven.test.skip=true install
。
其實,'install'是一個階段,而不是插件。不,你不應該使用'jar:jar',而是使用'package'階段(這就是構建生命週期的階段)。 – 2010-11-02 11:18:03
是的,「安裝」是安裝插件運行的階段。同樣,Compiler插件在「編譯」階段使用。 – dogbane 2010-11-02 12:00:06
我的觀點是,1.插件不執行任何事情,構建生命週期(安裝插件不會觸發例如測試)。 2.你通常調用階段,而不是插件。 – 2010-11-02 15:50:42
'test'是'構建'生命週期中的默認階段。如果你想跳過在測試過程中安裝內容添加到pom.xml中,
<build>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
</build>
,然後創建一個配置文件說,「測試」將包含測試配置。如果你想執行測試,請執行mvn -Ptest測試。
由於dogbane已經回答你不能跳過任何其他方式。
@Pascal這只是一個例子在實際項目中,我看到當我在一個文件中做一個單獨的更改,然後我想重新安裝(閱讀「重新部署到glassfish」)整個項目時,我不希望所有的JAR/WAR文件重新編譯,只是受影響的人..不幸的是,maven重新構建所有模塊..非常無效,你不同意嗎? – yegor256 2010-11-02 12:16:09
@Vincenzo:你的用例究竟是什麼? – 2010-11-02 14:37:26
@Pascal多模塊項目,具有廣泛的測試和靜態代碼分析,我運行'mvn clean install',t如果我在一個模塊中更改一個單獨的java文件。然後我運行'mvn install'並期望maven只測試/分析這個已更改的特定模塊。不幸的是,它重新測試並重新分析所有模塊。這需要很多時間.. – yegor256 2010-11-02 15:04:11