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

Posted

技术标签:

【中文标题】多模块项目中的 Maven 测试依赖项【英文标题】:Maven test dependency in multi module project 【发布时间】:2010-12-16 01:52:15 【问题描述】:

我使用 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 以使其构建。我该如何解决这个问题?

【问题讨论】:

您能分享一下您的父 pom 的样子吗? 【参考方案1】:

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

<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>

您在这里看到的主要区别是&lt;phase&gt; 标签。

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

为我工作。

【讨论】:

可以,很方便。感谢分享。我猜只有当你有一个公司目录时,部署方法才会更好(是的,我知道这是强烈推荐的)。谢谢@Roman【参考方案2】:

我对您要执行的操作存有疑问,但我假设您想在另一个项目(模块 1)中重用您为项目(模块 1)创建的测试。正如Guide to using attached tests底部的注释中所述:

请注意,本指南的先前版本建议使用 &lt;classifier&gt;tests&lt;/classifier&gt; 而不是 &lt;type&gt;test-jar&lt;/type&gt;。虽然这目前适用于某些情况,但如果调用安装之前的生命周期阶段,它在测试 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>

【讨论】:

帕斯卡。首先非常感谢您回答所有 Maven 问题!关于这个问题。我还有一个问题。我的核心模块之一中有一些 testBase 类,我想在所有子对象中使用它。我们目前在 CI 中构建了 maven。如果我不想对 test-jar 进行任何部署安装,而只是从主干中签出新副本并运行 mvn 测试。这失败了,因为我还没有任何地方的测试罐。知道如何处理吗? @Roman 运行安装是“自然”的方式。但您似乎找到了解决方法。 这似乎是这个问题 3559 而不是 2045 是此时的问题:jira.codehaus.org/browse/MNG-3559 尽管这解释了正在发生的事情,但它并没有提供解决方法。它只是建议做 OP(例如我)已经在做的事情。

以上是关于多模块项目中的 Maven 测试依赖项的主要内容,如果未能解决你的问题,请参考以下文章

使用maven搭建多模块项目

SpringBoot+Maven多模块项目(创建依赖打包可执行jar包部署测试)完整流程

SpringBoot+Maven多模块项目(创建依赖打包可执行jar包部署测试)完整流程

如何在我的 Maven Spring Boot 多模块项目的测试中引用兄弟模块?

Maven插件作为多模块项目中的依赖项

如何正确地实现Java模块与inter-module Maven构建测试依赖关系