2012-08-24 95 views
8

我正在處理的項目是由多個模塊,用maven構建。 某些模塊中的測試代碼依賴於來自其他模塊的測試代碼。 這些依賴關係聲明如下。如何運行maven編譯階段與測試jar依賴

在依賴模塊:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <version>2.2</version> 
    <executions> 
     <execution> 
      <goals> 
       <goal>test-jar</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

在具有先前的模塊上的依賴關係的模塊:

<dependency> 
    <groupId>${project.groupId}</groupId> 
    <artifactId>themodulename</artifactId> 
    <version>${project.version}</version> 
    <type>test-jar</type> 
    <scope>test</scope> 
</dependency> 

使用該配置,行家安裝相可以成功地被執行。 但試圖運行編譯測試階段失敗,因爲測試jar文件的依賴關係無法解析。

縱觀測試罐子目標,這似乎是默認配置在階段,我認爲這是問題的原因運行。

然後,我試圖迫使這一目標的期間運行編譯階段,通過修改第一配置成:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <version>2.2</version> 
    <executions> 
     <execution> 
      <phase>compile</phase> 
      <goals> 
       <goal>test-jar</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

望着調試日誌,我可以看到,我們的目標現在執行在編譯期間階段,也是這樣:

[WARNING] JAR will be empty - no content was marked for inclusion! 

我試圖配置包括對**/*,並確認默認testClassesDirectory被設置在右側e,但我仍然得到同樣的警告。

我可以看到,測試類的文件夾沒有運行編譯階段,這似乎正常後存在,但即使它運行測試階段之後存在,並且它包含的文件,我仍然得到「JAR將是空的」警告。

沒有人有解決這個配置,使我能夠順利的運行編譯測試階段的任何想法?

+0

也有類似的問題,一些插件。有興趣的。 – Scorpio

+1

昨天有類似的問題,然後我意識到我有maven.skip.tests選項設置爲true。在你的情況下它可能會類似嗎? – pushy

+0

你的聲明** test-jar **看起來有點奇怪,你能告訴我們這個相關模塊的pom頭嗎? – Farid

回答

3

我堅信測試應該只是一個模塊的一部分。你不應該依賴於其他模塊中的測試。如果更新測試的行爲不同,很難預測會發生什麼。

如果您需要共享通用測試數據或常用測試類,那麼最好使用該共享測試源創建單獨的模塊。然後讓所有測試都使用範圍測試對共享測試jar進行依賴。

+-- MyProject 
+-- common-test-util 
| +-- src 
| | +-- main 
| |  +-- java 
| +-- pom.xml 
+-- moduleA 
| +-- src 
| | +-- main 
| | | +-- java 
| | +-- test 
| |  +-- java 
| +-- pom.xml 
+-- moduleB 
| +-- src 
| | +-- main 
| | | +-- java 
| | +-- test 
| |  +-- java 
| +-- pom.xml 
+-- pom.xml 

請確保您僅依賴於common-test-util<scope>test</scope>,然後你就可以調用

mvn test 

在頂層,所有的測試運行。

+1

我恭敬地不同意。 Mocks,Test Doubles,Stubs,Drivers和其他測試框架代碼通常在模塊間共享,但不應包含在運行時代碼中。與常規的通用代碼jar一起構建一個通用的測試jar非常好。儘管我當然會同意在其他模塊中不應該使用特定於通用jar內部的測試。你可以分開這兩類代碼,但通常不值得付出努力。如果你有一個大型的測試框架,那麼把它當成一個單獨的項目。 – AutomatedMike

+2

@AutomatedMike這或多或少是我說的。把所有的東西放在一個jar中,並用在其他模塊的不同測試中。但不要試圖將其填充到src/test/java'中。把你的實際測試放在那裏。 – maba

+0

@maba - moduleB是集成測試,我在moduleA中有一個dto,我需要將一個Fixture放置在某個可以在moduleA和moduleB中使用的地方。在這種情況下你有什麼建議? – danidacar

3

您的問題歸結於多模塊構建中的依賴關係解決方案。它與測試代碼沒有特別的關係。

我正是這樣的設置。一個通用模塊包含運行時代碼和共享測試代碼(測試雙打& mock等)。測試代碼被其他模塊中的測試使用。它對我們非常有用。

「mvn compile」只編譯運行時代碼。

運行的「MVN測試編譯」,「MVN測試」或「MVN包」在父級別(反應器的構建)一切完美。反應器可以全部分類。

如果您在模塊級運行構建則該模塊的所有depedencies必須在回購協議。這意味着您必須爲每個相關模塊預先運行「mvn install」。該規則同樣適用於常規依賴和測試。

如果你希望它跟隨父連接起來,家長和到其他模塊我必須讓你失望。父鏈接僅用於繼承pom中的通用設置,而不用於依賴關係解析。

個人而言,我幾乎總是從父做了充分的反應器版本。我只做一個單獨的模塊構建,如果我以前在父級別運行mvn安裝,並且我知道其他模塊沒有更改。

希望有所幫助。

4

我認爲這些插件配置適合你。

只需在資源準備和編譯中將跳過覆蓋爲false即可。

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-resources-plugin</artifactId> 
    <executions> 
     <execution> 
     <id>default-testResources</id> 
     <configuration> 
      <skip>false</skip> 
     </configuration> 
     <phase>process-test-resources</phase> 
     <goals> 
      <goal>testResources</goal> 
     </goals> 
     </execution> 
    </executions> 
    </plugin> 
    <plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <executions> 
     <execution> 
     <id>default-testCompile</id> 
     <configuration> 
      <skip>false</skip> 
     </configuration> 
     <phase>test-compile</phase> 
     <goals> 
      <goal>testCompile</goal> 
     </goals> 
     </execution> 
    </executions> 
    </plugin> 
    <plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <executions> 
     <execution> 
     <configuration> 
      <skip>false</skip> 
     </configuration> 
     <goals> 
      <goal>test-jar</goal> 
     </goals> 
     </execution> 
    </executions> 
    </plugin> 
相關問題