2010-11-02 46 views
3

install我的Maven項目:爲什麼Maven在JAR已經存在的時候再次運行測試?

mvn clean install 

一切工作正常,在/target目錄中創建JAR文件。現在我再次運行它:

mvn install 

Maven的重新執行單元測試和靜態代碼分析。我沒有對.java文件進行任何更改,並且JAR在那裏,那麼爲什麼要再次運行測試呢?我做錯了什麼或者它是如何設計的?

回答

5

現在我跑一遍(...)Maven運行單元測試,並再次

靜態代碼分析因爲這是你問什麼簡單的Maven做。

當您調用build phase時,Maven不僅會執行該構建階段,還會執行被調用構建階段之前的每個構建階段。因此,調用:

mvn install 

運行前,每次構建階段installvalidatecompiletestpackage等),執行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 
+0

@Pascal這只是一個例子在實際項目中,我看到當我在一個文件中做一個單獨的更改,然後我想重新安裝(閱讀「重新部署到glassfish」)整個項目時,我不希望所有的JAR/WAR文件重新編譯,只是受影響的人..不幸的是,maven重新構建所有模塊..非常無效,你不同意嗎? – yegor256 2010-11-02 12:16:09

+0

@Vincenzo:你的用例究竟是什麼? – 2010-11-02 14:37:26

+0

@Pascal多模塊項目,具有廣泛的測試和靜態代碼分析,我運行'mvn clean install',t如果我在一個模塊中更改一個單獨的java文件。然後我運行'mvn install'並期望maven只測試/分析這個已更改的特定模塊。不幸的是,它重新測試並重新分析所有模塊。這需要很多時間.. – yegor256 2010-11-02 15:04:11

4

不幸的是,這是如何設計maven install插件。它執行最佳實踐,比如在安裝之前始終運行測試,因爲即使代碼沒有,其他環境因素也可能發生變化。

如果你只是想以增量編譯(即只有自上次編譯後更改過的那些文件),那麼你應該通過調用mvn compile使用compiler插件,然後建立罐子使用mvn jar:jar

跳過測試:mvn -Dmaven.test.skip=true install

+0

其實,'install'是一個階段,而不是插件。不,你不應該使用'jar:jar',而是使用'package'階段(這就是構建生命週期的階段)。 – 2010-11-02 11:18:03

+1

是的,「安裝」是安裝插件運行的階段。同樣,Compiler插件在「編譯」階段使用。 – dogbane 2010-11-02 12:00:06

+0

我的觀點是,1.插件不執行任何事情,構建生命週期(安裝插件不會觸發例如測試)。 2.你通常調用階段,而不是插件。 – 2010-11-02 15:50:42

2

'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已經回答你不能跳過任何其他方式。

+0

測試是最不耗時的操作,靜態代碼分析如何?我應該在每個插件中做這些技巧? :( – yegor256 2010-11-02 10:52:24

+0

是的,你是對的,但據我所知沒有其他的方式。讓我們知道,如果你找到另一種方式,除了我提到的 – Adi 2010-11-02 11:25:13

+0

@Adi我想要這樣的事情雖然我不知道如何編寫單獨的配置文件,並設置哪一個工作時,所以我剛剛添加它,直到寫入更多的代碼,並且將得到2測試時將其刪除/評論 – 2013-01-25 11:54:14

相關問題