我是Maven的新手,我试图将一些项目转换为Maven工作,而我不确定构建它们的正确方法是什么 - 这就是我所拥有的:
我有一个名为Common
的公共模块和两个不同的应用程序,这些应用程序与它们都依赖于Common
的事实没有任何共同之处。我们称他们为A
和B
。
A
- > Common
和B
- > Common
之间的依赖关系既适用于运行时也适用于测试 - 意味着A
&# 39;测试类需要Common
的测试类。
我尝试了各种我能想到的组合 - 但是他们没有产生我想要的东西。
奇怪的是我的代码编译,但JUnits失败,因为在类路径中找不到Common
的测试类。
我应该向Common
添加2个配置文件以创建2个工件,并在A
和B
中为两个工件添加2个依赖项吗? (那可能吗?)
有没有正确的方法来做我想要的?我应该重构我的代码以适应Maven吗?
答案 0 :(得分:5)
这是一个常见的maven陷阱。当您依赖该工件时,工件中的测试类不可用。这实际上是合理的:当你依赖Common
时,你依赖于生产类(JAR文件)。测试类仅用于运行测试,甚至不包含在最终的JAR中。
假设您的Common
测试类包含所有Common
测试,A
和B
测试所需的一些实用工具方法,这里有一个建议的结构:
Common-test
- 包含/src/main/java
中的常见实用程序测试类(不是测试用例!)(!)Common
取决于Common-test
与<scope>test</scope>
A
和B
取决于Common
(默认范围)和Common-test
(test
范围)
答案 1 :(得分:2)
你可以像
那样构建它现在为<dependency>
&amp;添加CommonProject A
B
,这将使公共项目在编译时可用,因此构建会很顺利,
如果你的A&amp; B是webapp archtype然后你需要确保你的依赖项在WEB-INF / lib中可用,以便它可以在运行时获得依赖项
要使依赖项仅在test
时可用,您可以使用test
scope
答案 2 :(得分:2)
您必须在test-jar
项目中运行maven-jar-plugin
Common
目标。
这将生成一个带有tests
分类器的新工件,其中包含src/test
树中的所有类和资源。
所以,在Common中加上这个:
<plugins>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<id>test-jar</id>
<goals>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>
...
</plugins>
在A
和B
添加此
<dependency>
<groupId>common.group.id</groupId>
<artifactId>Common</artifactId>
<version>1.0</version>
<classifier>tests</classifier>
<scope>test</scope>
</dependency>
请注意此依赖关系声明中的<classifier>tests</classifier>
。