Maven项目设计 - 共享一个共同的项目

时间:2012-06-22 17:33:13

标签: java maven

我是Maven的新手,我试图将一些项目转换为Maven工作,而我不确定构建它们的正确方法是什么 - 这就是我所拥有的:

我有一个名为Common的公共模块和两个不同的应用程序,这些应用程序与它们都依赖于Common的事实没有任何共同之处。我们称他们为AB

A - > CommonB - > Common之间的依赖关系既适用于运行时也适用于测试 - 意味着A&# 39;测试类需要Common的测试类。

我尝试了各种我能想到的组合 - 但是他们没有产生我想要的东西。 奇怪的是我的代码编译,但JUnits失败,因为在类路径中找不到Common的测试类。

我应该向Common添加2个配置文件以创建2个工件,并在AB中为两个工件添加2个依赖项吗? (那可能吗?) 有没有正确的方法来做我想要的?我应该重构我的代码以适应Maven吗?

3 个答案:

答案 0 :(得分:5)

这是一个常见的maven陷阱。当您依赖该工件时,工件中的测试类不可用。这实际上是合理的:当你依赖Common时,你依赖于生产类(JAR文件)。测试类仅用于运行测试,甚至不包含在最终的JAR中。

假设您的Common测试类包含所有Common测试,AB测试所需的一些实用工具方法,这里有一个建议的结构:

  • Common-test - 包含/src/main/java中的常见实用程序测试类(不是测试用例!)(!)
  • Common取决于Common-test<scope>test</scope>
  • AB取决于Common(默认范围)和Common-testtest范围)

UML

答案 1 :(得分:2)

你可以像

那样构建它
  • 共同项目
  • 项目
  • B项目

现在为<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>

AB添加此

<dependency>
  <groupId>common.group.id</groupId>
  <artifactId>Common</artifactId>
  <version>1.0</version>
  <classifier>tests</classifier>
  <scope>test</scope>
</dependency>

请注意此依赖关系声明中的<classifier>tests</classifier>