如何使用test-jar依赖项运行maven编译阶段

时间:2012-08-24 07:07:48

标签: java testing maven dependencies maven-plugin

我正在开发的项目由多个模块组成,使用maven构建。 某些模块中的测试代码依赖于来自其他模块的测试代码。 这些依赖关系声明如下。

在依赖模块中:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.2</version>
    <executions>
        <execution>
            <goals>
                <goal>test-jar</goal>
            </goals>
        </execution>
    </executions>
</plugin>

在依赖于前一个模块的模块中:

<dependency>
    <groupId>${project.groupId}</groupId>
    <artifactId>themodulename</artifactId>
    <version>${project.version}</version>
    <type>test-jar</type>
    <scope>test</scope>
</dependency>

使用此配置,maven install 阶段可以成功执行。 但是,尝试运行 compile test 阶段失败,因为无法解析测试jar文件依赖性。

查看 test-jar 目标,它似乎被配置为在阶段默认运行,我认为这是导致问题的原因。< / p>

然后,我尝试在编译阶段强制执行此目标,方法是将第一个配置修改为:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.2</version>
    <executions>
        <execution>
            <phase>compile</phase>
            <goals>
                <goal>test-jar</goal>
            </goals>
        </execution>
    </executions>
</plugin>

查看调试日志,我可以看到目标现在在编译阶段执行,但也是这样:

[WARNING] JAR will be empty - no content was marked for inclusion!

我尝试将包含配置为** / *并确认默认的testClassesDirectory设置为正确的,但我仍然得到相同的警告。

我可以看到运行 compile 阶段后test-classes文件夹不存在,这似乎正常,但即使它在运行 test 阶段后仍然存在,它包含文件,我仍然得到“JAR将为空”警告。

有没有人知道修复此配置,以便我可以成功运行编译测试阶段?

3 个答案:

答案 0 :(得分:5)

我认为这些插件配置适合您。

在资源准备和编译中将跳过覆盖为false。

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <executions>
      <execution>
        <id>default-testResources</id>
        <configuration>
          <skip>false</skip>
        </configuration>
        <phase>process-test-resources</phase>
        <goals>
          <goal>testResources</goal>
        </goals>
      </execution>
    </executions>
  </plugin>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <executions>
      <execution>
        <id>default-testCompile</id>
        <configuration>
          <skip>false</skip>
        </configuration>
        <phase>test-compile</phase>
        <goals>
          <goal>testCompile</goal>
        </goals>
      </execution>
    </executions>
  </plugin>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <executions>
      <execution>
        <configuration>
          <skip>false</skip>
        </configuration>
        <goals>
          <goal>test-jar</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

答案 1 :(得分:3)

我坚信测试应该只是一个模块的一部分。您不应该依赖其他模块中的测试。如果更新测试的行为不同,很难预测会发生什么。

如果您需要共享通用测试数据或常见测试类,那么最好使用该共享测试源创建单独的模块。然后让所有测试都依赖于带有范围测试的共享测试jar。

+-- MyProject
+-- common-test-util
|   +-- src
|   |    +-- main
|   |        +-- java
|   +-- pom.xml
+-- moduleA
|   +-- src
|   |    +-- main
|   |    |   +-- java
|   |    +-- test
|   |        +-- java
|   +-- pom.xml
+-- moduleB
|   +-- src
|   |    +-- main
|   |    |   +-- java
|   |    +-- test
|   |        +-- java
|   +-- pom.xml
+-- pom.xml

确保您只依靠common-test-util<scope>test</scope>,然后您就可以致电

mvn test

在顶层,所有测试都将运行。

答案 2 :(得分:3)

您的问题归结于多模块构建中的依赖项解析。它与测试代码没有特别的关系。

我有这个设置。一个通用模块包含运行时代码以及共享测试代码(测试双精度和模拟等)。测试代码由其他模块中的测试使用。它对我们很有效。

“mvn compile”仅编译运行时代码。

在父级别(反应堆构建)运行“mvn test-compile”,“mvn test”或“mvn package”一切都很完美。反应堆可以将它全部分类。

如果您在模块级别运行构建,那么该模块的所有依赖项都必须在repo中。这意味着您必须为每个依赖模块主要运行“mvn install”。此规则同样适用于常规依赖项和测试依赖项。

如果您希望它跟随父母链接到父母,再到其他模块,我必须让您失望。父链接仅用于继承pom中的常用设置,而不用于依赖项解析。

就个人而言,我几乎总是从父母那里做一个完整的反应堆构建。如果我以前在父级别运行mvn安装并且我知道其他模块没有更改,我只进行单独的模块构建。

希望有所帮助。