多模块项目中的 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>
您在这里看到的主要区别是<phase>
标签。
我将创建 test-jar,它将在测试的编译阶段可用,而不仅仅是在打包阶段之后。
为我工作。
【讨论】:
可以,很方便。感谢分享。我猜只有当你有一个公司目录时,部署方法才会更好(是的,我知道这是强烈推荐的)。谢谢@Roman【参考方案2】:我对您要执行的操作存有疑问,但我假设您想在另一个项目(模块 1)中重用您为项目(模块 1)创建的测试。正如Guide to using attached tests底部的注释中所述:
请注意,本指南的先前版本建议使用
<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 install
或 mvn 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 测试依赖项的主要内容,如果未能解决你的问题,请参考以下文章
SpringBoot+Maven多模块项目(创建依赖打包可执行jar包部署测试)完整流程
SpringBoot+Maven多模块项目(创建依赖打包可执行jar包部署测试)完整流程