Java Maven项目设计-共享公共项目
我是Maven的新手,我正在尝试将一些项目转换为Maven,但我不确定构建它们的正确方法是什么-以下是我的: 我有一个公共模块,名为Java Maven项目设计-共享公共项目,java,maven,Java,Maven,我是Maven的新手,我正在尝试将一些项目转换为Maven,但我不确定构建它们的正确方法是什么-以下是我的: 我有一个公共模块,名为common,两个不同的应用程序没有任何共同之处,因为它们都依赖于common。让我们称它们为A和B A->Common和B->Common之间的依赖关系既适用于运行时,也适用于测试-这意味着A的测试类需要Common的测试类 我尝试了各种我能想到的组合,但没有一种能产生我想要的效果。 奇怪的是,我的代码可以编译,但是JUnits失败了,因为在类路径中找不到来自Co
common
,两个不同的应用程序没有任何共同之处,因为它们都依赖于common
。让我们称它们为A
和B
A
->Common
和B
->Common
之间的依赖关系既适用于运行时,也适用于测试-这意味着A
的测试类需要Common
的测试类
我尝试了各种我能想到的组合,但没有一种能产生我想要的效果。
奇怪的是,我的代码可以编译,但是JUnits失败了,因为在类路径中找不到来自Common
的测试类
我是否应该向公共
添加2个配置文件以创建2个工件,并在A
和B
中向这两个工件添加2个依赖项?(可能吗?)
有没有正确的方法来做我想做的事?我应该重新构造代码以适应Maven吗?您可以像这样构造代码
- 共同项目
- 工程
- B项目
A
&B
将CommonProject添加到
,这将使CommonProject在编译时可用,从而使构建工作正常进行
如果您的A&B是或webapp archtype,那么您需要确保您的依赖项在WEB-INF/lib中可用,以便它可以在运行时获取依赖项
要使依赖项仅在
测试时可用,可以使用这是一个常见的maven陷阱。当您依赖某个工件时,该工件中的测试类不可用。这实际上是合理的:当您依赖于Common
时,您依赖于生产类(JAR文件)。测试类仅用于运行测试,甚至不包括在最终的JAR中
假设您的Common
测试类包含所有Common
测试、A
和B
测试所需的一些实用方法,下面是一个建议的结构:
Common test
-在/src/main/java
中包含公共实用程序测试类(不是测试用例!)(!)
普通
取决于普通测试
和测试
A
和B
取决于Common
(带默认范围)和Common test
(带test
范围)
您必须在公共项目中运行测试jar
maven jar plugin
的目标
这将生成一个带有tests
分类器的新工件,它包含src/test
树中的所有类和资源
因此,共同添加以下内容:
<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>
注意测试此依赖项声明中的。您使用了什么制作此图表?看起来很整洁。谢谢你让我知道,+1谢谢。如果我理解正确,这就是Sonatype()推荐的体系结构。对吗?你认为Alexander Pogrebnyak()提供的答案不符合Maven模块化建议吗?这是最好的方法。不要使用这种测试jar
方法,因为它可能会导致一些问题。@TomaszNurkiewicz没有UML图,请附上该图。谢谢-这就成功了。但是从我读到的——这可能不是推荐的体系结构——这是正确的吗?Tomasz Nurkiewicz()从maven架构的角度给出的答案更好吗?@RonK。我想说,如果资源Common/src/test
包含在Common
中创建测试对象的后门,请使用我的方法。如果类中包含公共测试工具和框架,则使用Tomasz的方法。
<dependency>
<groupId>common.group.id</groupId>
<artifactId>Common</artifactId>
<version>1.0</version>
<classifier>tests</classifier>
<scope>test</scope>
</dependency>