多模块项目中的Maven测试依赖性

use*_*947 81 maven-2 maven-plugin

我使用maven来构建一个多模块项目.我的模块2依赖于编译范围的模块1 src和测试范围中的模块1测试.

第2单元 -

   <dependency>
       <groupId>blah</groupId>
       <artifactId>MODULE1</artifactId>
       <version>blah</version>
       <classifier>tests</classifier>
       <scope>test</scope>
   </dependency>
Run Code Online (Sandbox Code Playgroud)

这很好用.假设我的模块3依赖于Module1 src并在编译时进行测试.

第3单元 -

   <dependency>
       <groupId>blah</groupId>
       <artifactId>MODULE1</artifactId>
       <version>blah</version>
       <classifier>tests</classifier>
       <scope>compile</scope>
   </dependency>
Run Code Online (Sandbox Code Playgroud)

当我运行时mvn clean install,我的构建运行到模块3,在模块3处失败,因为它无法解析模块1测试依赖性.然后我mvn install单独对模块3进行操作,返回并mvn install在我的父pom上运行以使其构建.我怎样才能解决这个问题?

Pas*_*ent 117

我怀疑你要做什么,但我会假设你想重用你为另一个项目(module1)创建的测试.正如使用附加测试指南底部的说明中所解释的那样:

请注意,本指南的先前版本建议使用<classifier>tests</classifier>而不是<type>test-jar</type>.虽然目前适用于某些情况,但在调试JAR模块的反应器构建期间,如果调用安装之前的生命周期阶段,则它在任何使用者中都无法正常工作.在这种情况下,Maven不会从reactor构建的输出解析测试JAR,而是从本地/远程存储库解析测试JAR.显然,来自存储库的JAR可能已过时或完全丢失,导致构建失败(参见MNG-2045).

因此,首先,要将已编译的测试打包在JAR中并将其部署以进行一般性重用,请maven-jar-plugin按如下方式进行配置:

<project>
  <build>
    <plugins>
     <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>
    </plugins>
  </build>
</project>
Run Code Online (Sandbox Code Playgroud)

然后,照常安装/部署测试JAR工件(使用mvn installmvn deploy).

最后,要使用测试JAR,您应该指定具有指定类型的依赖项test-jar:

<project>
  ...
  <dependencies>
    <dependency>
      <groupId>com.myco.app</groupId>
      <artifactId>foo</artifactId>
      <version>1.0-SNAPSHOT</version>
      <type>test-jar</type>
      <scope>test</scope>
    </dependency>
  </dependencies>
  ...
</project>
Run Code Online (Sandbox Code Playgroud)

  • 帕斯卡尔.首先感谢回答所有maven问题!关于这个问题.我还有一个问题.我在我的一个核心模块中有一些testBase类,我希望在所有子对象中使用它.我们目前在CI中有maven构建.如果我不想对测试jar进行任何部署安装,只是从trunk查看一个新副本并运行mvn测试.这失败了,因为我还没有测试罐.知道怎么处理吗? (3认同)

Rom*_*man 17

关于我对Pascals问题的评论,我想我找到了一个合适的答案:

<plugins>
    <plugin>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.2</version>
        <executions>
            <execution>
            <goals>
                <goal>test-jar</goal>
            </goals>
            <phase>test-compile</phase>
        </execution>
        </executions>
        <configuration>
            <outputDirectory>${basedir}\target</outputDirectory>
        </configuration>
    </plugin>
</plugins>
Run Code Online (Sandbox Code Playgroud)

这里看到的主要区别是<phase>标签.

我将创建测试jar,它将在测试的编译阶段提供,而不仅仅是在封装阶段之后.

适合我.