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

时间:2009-11-12 21:17:06

标签: 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>

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

第3单元 -

   <dependency>
       <groupId>blah</groupId>
       <artifactId>MODULE1</artifactId>
       <version>blah</version>
       <classifier>tests</classifier>
       <scope>compile</scope>
   </dependency>

当我运行mvn clean install时,我的构建运行到模块3,在模块3处失败,因为它无法解析模块1测试依赖性。然后我单独在模块3上执行mvn install,返回并在我的父pom上运行mvn install以使其构建。我该如何解决这个问题?

3 个答案:

答案 0 :(得分:114)

我怀疑你要做什么,但我会假设你想重用你为另一个项目(module1)创建的测试。正如Guide to using attached tests

底部的说明中所述
  

请注意,本指南的前几版建议使用<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>

然后,照常安装/部署测试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>

答案 1 :(得分:16)

关于我对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>

此处的主要区别在于<phase>标记。

我将创建测试jar,它将在测试的编译阶段提供,而不仅仅是在打包阶段之后。

适合我。

答案 2 :(得分:2)

https://maven.apache.org/plugins/maven-jar-plugin/examples/create-test-jar.html说:

  

如何创建包含测试类的jar   当您想创建一个包含测试类的jar时,您可能想重用这些类。有两种解决方法:

     
      
  1. The easy way使用当前项目中的测试类创建一个附加jar,并释放其可传递的测试作用域依赖性。

  2.   
  3. The preferred way用测试类创建一个单独的项目。

  4.   

请详细阅读该文章。