如何创建一个包含测试类的 jar

当您想创建一个包含test-classes的 jar 时,您可能希望重用这些类。有两种方法可以解决这个问题:

  • 使用当前项目中的测试类创建一个附加的 jar,并释放其可传递的测试范围依赖项。
  • 使用test-classes创建一个单独的项目。

简单的方法

您可以生成一个包含您的测试类和资源的 jar。

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

要在其他项目中重用此工件,您必须使用类型 test-jar 声明此依赖项:

<project>
  ...
  <dependencies>
    <dependency>
      <groupId>groupId</groupId>
      <artifactId>artifactId</artifactId>
      <classifier>tests</classifier>
      <type>test-jar</type>
      <version>version</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  ...
</project>

基于这样的配置,将生成两个 jar 文件。第一个包含来自src/main/java的类,而第二个包含来自src/test/java的类。生成的 jar 文件遵循第一个命名模式artifactId-version.jar和第二个命名模式 artifactId -version-classifier.jar。部件artifactId版本将替换为项目pom.xml文件中给出的值。分类器将设置为测试,这是 maven-jar-plugin 的默认设置,如果需要,可以使用 jar 目标中的配置进行更改.

注意:此解决方案的缺点是您不会自动获得传递测试范围的依赖项。Maven 仅解决编译时依赖项,因此您必须手动添加所有其他必需的测试范围依赖项。

首选方式

为了让 Maven 解决所有test范围的传递依赖项,您应该创建一个单独的项目。

<project>
   <groupId>groupId</groupId>
    <artifactId>artifactId-tests</artifactId>
    <version>version</version>
  ...
</project>
  • 将要共享的源文件从src/test/java从原始项目移动到该项目的src/main/java。当然,相同类型的移动对资源也很重要。
  • 将所需的test范围的依赖项和从原始项目移动到此项目并删除范围(即,将其更改为compile范围)。是的,这意味着 junit 依赖项(或任何其他测试框架依赖项)也获得了默认范围。您可能还需要添加一些特定于项目的依赖项,以便再次编译。

现在你有了可重用的测试类,你可以像以前那样引用它:

<project>
  ...
  <dependencies>
    <dependency>
      <groupId>groupId</groupId>
      <artifactId>artifactId-tests</artifactId>
      <version>version</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  ...
</project>