我有一个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上添加依赖项,但我希望能有更优雅的解决方案。
(我知道使用分类器是不赞成的,但我不确定这里是否可以避免......)
答案 0 :(得分:3)
我想我想出来了,使用 maven-antrun-plugin 的组合来创建多个测试jar文件(使用 jar 任务)和 build-helper-maven-plugin 将生成的jar文件作为工件附加到项目中。
我使用 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文件放入其自己的目录中:
目标/伪影/测试/ foo.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 上添加依赖项。好哇!