我可以让maven生成两个具有不同分类器的测试罐吗?

时间:2014-11-30 23:56:26

标签: unit-testing maven

我有一个maven项目,我为一些模块生成了一些测试代码。我希望这个生成的测试代码可供其他模块测试。通常,如果模块 bar 想要使用模块 foo 的测试代码, foo 模块必须生成 foo-tests.jar 和模块 bar 添加了依赖项,例如:

<dependency>
  <artifactId>foo</artifactId>
  <classifier>tests</classifier>
  <scope>test</scope>
</dependency>

哪个好,除了我只想提取生成的 foo 测试代码,而不是所有 foo 的单元测试和辅助类(例如,可能存在意外的类冲突)。我想定义一个依赖项,例如:

<dependency>
  <artifactId>foo</artifactId>
  <classifier>test-libs</classifier>
  <scope>test</scope>
</dependency>

通常 maven-jar-plugin 用于生成 foo-test 工件,所以我希望我可以配置该插件来生成两个测试工件:一个包含 foo-tests 中常用的测试代码(单元测试等),以及包含 foo-test-libs 中生成的代码的代码,使用两个不同的分类器,例如:

<plugin>
  <artifactId>maven-jar-plugin</artifactId>
  <executions>
    <execution>
      <id>generate-test-jar</id>
      <phase>package</package>
      <goals><goal>test-jar</goal></goals>
      <configuration>
        <excludes>... all the generated code ...</excludes>
      </configuration>
    </execution>
    <execution>
      <id>generate-test-libs-jar</id>
      <phase>package</package>
      <goals><goal>test-jar</goal></goals>
      <classifier>test-libs</classifier>
      <configuration>
        <includes>... all the generated code ...</includes>
      </configuration>
    </execution>
  </executions>
</plugin> 

问题在于,与 jar 目标不同, maven-jar-plugin test-jar 目标不支持分类器元素。我假设目标默认使用 test 分类器,所以我不能生成两个具有不同分类器的测试罐。

我想知道是否有一个很好的方法来分割maven模块的测试罐?如果所有其他方法都失败了,我可以回去在完整的测试jar上添加依赖项,但我希望能有更优雅的解决方案。

(我知道使用分类器是不赞成的,但我不确定这里是否可以避免......)

1 个答案:

答案 0 :(得分:3)

我想我想出来了,使用 maven-antrun-plugin 的组合来创建多个测试jar文件(使用 jar 任务)和 build-helper-maven-plugin 将生成的jar文件作为工件附加到项目中。

  1. 生成测试jar文件。
  2. 我使用 maven-antrun-plugin 结合ant jar 任务来分割我的测试代码:

    <plugin>
      <artifactId>maven-antrun-plugin</artifactId>
      <version>1.7</version>
      <executions>
        <execution>
          <phase>package</phase>
          <goals><goal>run</goal></goals>
          <configuration>
            <target>
              <!-- The test-libs jar contains all test code in the x.y.z package. -->
              <jar destfile="${project.build.directory}/artifacts/test-libs/${project.build.finalName}.jar"
                   basedir="${project.build.directory}/test-classes"
                   includes="x/y/z/**/*.class"/>
              <!-- The tests jar contains all test code exception the x.y.z package. -->
              <jar destfile="${project.build.directory}/artifacts/tests/${project.build.finalName}.jar"
                   basedir="${project.build.directory}/test-classes"
                   excludes="x/y/z/**/*.class"/>
            </target>
          </configuration>
        </execution>
      </executions>
    </plugin>
    

    请注意,我必须为每个生成的jar文件使用相同的名称​​ $ {project.build.finalName} .jar (这在以后很重要)所以我将每个jar文件放入其自己的目录中:

    • target / artifacts / test-libs / foo.jar
    • 目标/伪影/测试/ foo.jar中

      1. 将jar文件附加到项目中。

    生成jar文件只是第一步。需要将jar文件附加到maven项目,以便安装它们。为此,需要 build-helper-maven-plugin 。这允许将文件附加为工件,其中每个文件具有位置,类型和分类器。这里的类型是 jar ,分类器将适当地 tests test-libs

    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>build-helper-maven-plugin</artifactId>
      <version>1.9</version>
      <executions>
        <execution>
          <id>attach-test-jars</id>
          <phase>package</phase>
          <goals><goal>attach-artifact</goal></goals>
          <configuration>
            <artifacts>
              <!-- Attach the test-libs artifact. -->
              <artifact>
                <file>${project.build.directory}/artifacts/test-libs/${project.build.finalName}.jar</file>
                <type>jar</type>
                <classifier>test-libs</classifier>
              </artifact>
              <!-- Attach the tests artifact. -->
              <artifact>
                <file>${project.build.directory}/artifacts/tests/${project.build.finalName}.jar</file>
                <type>jar</type>
                <classifier>tests</classifier>
              </artifact>
            </artifacts>
          </configuration>
        </execution>
      </executions>
    </plugin>
    

    有了这个,我现在看到以下输出:

    [INFO] Installing ...\target\artifacts\test-libs\foo-1.0.jar to ...\foo\1.0\foo-1.0-test-libs.jar
    [INFO] Installing ...\target\artifacts\tests\foo-1.0.jar to ...\foo\1.0\foo-1.0-tests.jar
    [INFO] Installing ...\target\foo-1.0.jar to ...\foo\1.0\foo-1.0.jar
    

    我的其他项目现在可以根据需要在 foo-test.jar foo-test-lib.jar 上添加依赖项。好哇!