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


86

我使用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的测试依赖关系。然后,我mvn install单独在模块3上执行一个操作,返回并mvn install在我的父pom上运行以使其构建。我怎样才能解决这个问题?


您能分享一下您的父母pom的样子吗?
克里斯·古默

Answers:


127

我对您要执行的操作有疑问,但我假设您想在另一个项目中重用为项目(模块1)创建的测试。如使用附加测试指南底部的注释中所述:

请注意,本指南的先前版本建议使用<classifier>tests</classifier>代替<type>test-jar</type>。尽管目前这在某些情况下可行,但如果在安装之前调用了生命周期阶段,则在测试JAR模块和任何使用者的反应堆构建期间,它将无法正常工作。在这种情况下,Maven不会从反应堆版本的输出中而是从本地/远程存储库中解析测试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>

3
帕斯卡。首先,非常感谢您回答所有Maven问题!关于这个问题。我还是有问题。我要在所有子对象中使用的核心模块之一中有一些testBase类。我们目前在CI中已建立专家团队。如果我不想做任何部署到test-jar的安装,只是想从主干中取出一个新副本并运行mvn测试。这失败了,因为我还没有测试罐。知道如何处理吗?
罗马2010年

@Roman运行安装是“自然”的方式。但是看来您找到了解决方法。
Pascal Thivent

似乎是问题3559而不是2045,这是此时的问题: jira.codehaus.org/browse/MNG-3559
HDave

充分说明了发生的事情,但没有提供解决方法。它只是建议做OP(例如我)已经在做的事情。
Antoniossss

19

关于我对帕斯卡尔问题的评论,我认为我已经找到了一个合适的答案:

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

我将创建测试罐,它将在测试的编译阶段可用,而不仅在打包阶段之后可用。

为我工作。


1
是的,非常方便。感谢分享。我想只有在拥有公司目录的情况下,部署方法才更好(是的,我知道强烈建议这样做)。感谢@Roman
Damien

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.