6

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

我有一个共同的模块命名Common和两个不同的应用程序,它们没有任何共同之处,因为它们都依赖于事实Common。让我们称它们为Aand B

A->CommonB->之间的依赖关系Common既适用于运行时也适用于测试——这意味着A's 的测试类需要Common's 的测试类。

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

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

4

3 回答 3

5

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

假设您的测试类包含所有测试和测试Common所需的一些实用方法,这是一个建议的结构:CommonAB

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

UML
(来源:yuml.me

于 2012-06-22T17:40:05.820 回答
2

你可以像这样构造它

  • 共同项目
  • 一个专案
  • B项目

现在将 CommonProject 添加到<dependency>for A& B,这将使 commonproject 在编译时可用,因此构建会很好,

如果您的 A & B 是或 webapp 架构类型,那么您需要确保您的依赖项在 WEB-INF/lib 中可用,以便它可以在运行时获取依赖项

要使依赖项仅在某个test时间可用,您可以使用test范围

于 2012-06-22T17:38:04.960 回答
2

你必须在你的项目中运行test-jar目标。maven-jar-pluginCommon

这会生成一个带有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>

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>此依赖项声明。

于 2012-06-22T17:42:06.587 回答