Java Maven项目设计-共享公共项目

Java Maven项目设计-共享公共项目,java,maven,Java,Maven,我是Maven的新手,我正在尝试将一些项目转换为Maven,但我不确定构建它们的正确方法是什么-以下是我的: 我有一个公共模块,名为common,两个不同的应用程序没有任何共同之处,因为它们都依赖于common。让我们称它们为A和B A->Common和B->Common之间的依赖关系既适用于运行时,也适用于测试-这意味着A的测试类需要Common的测试类 我尝试了各种我能想到的组合,但没有一种能产生我想要的效果。 奇怪的是,我的代码可以编译,但是JUnits失败了,因为在类路径中找不到来自Co

我是Maven的新手,我正在尝试将一些项目转换为Maven,但我不确定构建它们的正确方法是什么-以下是我的:

我有一个公共模块,名为
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>