[英]How to run maven compile phase with test-jar dependencies
我正在研究的項目由多個模塊組成,使用maven構建。 某些模塊中的測試代碼依賴於來自其他模塊的測試代碼。 這些依賴關系聲明如下。
在依賴模塊中:
<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>
使用此配置,可以成功執行maven 安裝階段。 但是嘗試運行編譯或測試階段失敗,因為無法解析測試jar文件依賴性。
看一下測試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設置為正確的,但我仍然得到相同的警告。
我可以看到運行編譯階段后test-classes文件夾不存在,這看起來很正常,但即使它在運行測試階段后存在,並且它包含文件,我仍然會得到“JAR將為空”警告。
有沒有人知道修復這個配置,以便我可以成功運行編譯或測試階段?
我認為這些插件配置適合您。
只需在資源准備和編譯中覆蓋skip to 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>
您的問題歸結為多模塊構建中的依賴項解析。 它與測試代碼無關。
我有這個設置。 一個通用模塊包含運行時代碼以及共享測試代碼(測試雙打和模擬等)。 測試代碼由其他模塊中的測試使用。 它對我們很有用。
“mvn compile”僅編譯運行時代碼。
在父級別(反應堆構建)運行“mvn test-compile”,“mvn test”或“mvn package”一切都很完美。 反應堆可以全部排序。
如果您在模塊級別運行構建,那么該模塊的所有依賴項都必須在repo中。 這意味着您必須為每個依賴模塊主要運行“mvn install”。 此規則同樣適用於常規依賴項和測試依賴項。
如果您希望它會跟隨父鏈接到父級,再到其他模塊,我必須讓您失望。 父鏈接僅用於繼承pom中的常用設置,而不用於依賴項解析。
就個人而言,我幾乎總是從父母那里做一個完整的反應堆構建。 如果我以前在父級別運行mvn安裝並且我知道其他模塊沒有更改,我只進行單獨的模塊構建。
希望有所幫助。
我堅信測試應該只是一個模塊的一部分。 您不應該依賴其他模塊中的測試。 如果更新測試的行為不同,很難預測會發生什么。
如果您需要共享通用測試數據或通用測試類,那么最好使用該共享測試源創建單獨的模塊。 然后讓所有測試都依賴於帶有范圍測試的共享測試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
確保您只依賴於帶有<scope>test</scope>
common-test-util
,然后您就可以調用了
mvn test
在頂層,所有測試都將運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.