簡體   English   中英

如何使用test-jar依賴項運行maven編譯階段

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM