45

There is a clear solution for sharing the common test code between maven projects using test-jar goal of maven-jar-plugin plugin (see here).

I need to do the similar thing with test resources, in particular, I want test resources of project A be available in the classpath of project B during testing.

For project A one need to declare:

<!-- Package and attach test resources to the list of artifacts: --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-antrun-plugin</artifactId> <executions> <execution> <phase>package</phase> <goals> <goal>run</goal> </goals> <configuration> <tasks> <jar destfile="${project.build.directory}/test-resources.jar"> <fileset dir="${project.basedir}/test-resources" /> </jar> </tasks> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>build-helper-maven-plugin</artifactId> <executions> <execution> <phase>package</phase> <goals> <goal>attach-artifact</goal> </goals> <configuration> <artifacts> <artifact> <file>${project.build.directory}/test-resources.jar</file> <type>jar</type> <classifier>test-resources</classifier> </artifact> </artifacts> </configuration> </execution> </executions> </plugin> 

And in project B it will be normal dependency:

<dependency> <groupId>myproject.groupId</groupId> <artifactId>myartifact</artifactId> <version>1.0-SNAPSHOT</version> <classifier>test-resources</classifier> <scope>test</scope> </dependency> 

Question: Should it work in all cases? Is it possible to pack resources without maven-antrun-plugin (using more 'lightweight' plugin)?

2
  • Seems there is a need to enhance remote resource plugin for test resources - maven.apache.org/plugins/maven-remote-resources-plugin/… Commented Feb 11, 2010 at 21:35
  • @centar: thanks for the interesting plugin information, although, what you said is a bit offtopic :) Commented Feb 15, 2010 at 11:09

4 Answers 4

44

Just use jar:test-jar and declare the resulting JAR as a dependency (refer to this guide for more details). And while I don't understand the problem of having resources and classes in this jar, you can always exclude all .class files:

<project> <build> <plugins> <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> <configuration> <excludes> <exclude>**/*.class</exclude> </excludes> </configuration> </plugin> </plugins> </build> </project> 

And to use it:

<project> ... <dependencies> <dependency> <groupId>com.myco.app</groupId> <artifactId>foo</artifactId> <version>1.0-SNAPSHOT</version> <type>test-jar</type> <scope>test</scope> </dependency> </dependencies> ... </project> 
Sign up to request clarification or add additional context in comments.

9 Comments

Shouldn't the execution phase be set to package?
@sal It is because jar:test-jar "binds by default to the lifecycle phase: package."
@Pascal: Thanks for the hint. I agree, that makes sense to package resources with classes. +1 for your answer, however, the original questions was not answered (how to package test resources separately in most optimal way?).
@dma_k Well, I suggested a way to exclude classes and thus to package the test resources only. Doesn't this answer the question?
@Pascal: Yes, your answer can be really accepted. Maybe you can also help me to find out, how maven-jar-plugin also adds test resources to destination jar file? I haven't found any code that does it in org.apache.maven.plugin.jar.AbstractJarMojo.java. Who helps him to add resources?
|
6

Accepted answer helped me, but it's not quite accurate in case you need regular jar of same project as well. It will delete *.class files from both jars.
Settings below translates to something like:

  • create me 2 jars: 1 regular, 1 test;
  • remove *.class files, but only from test jar

 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <executions> <execution> <goals> <goal>test-jar</goal> </goals> <configuration> <excludes> <exclude>**/*.class</exclude> </excludes> </configuration> </execution> </executions> </plugin> 

2 Comments

I don't really see the difference in comparison with POM snippet from accepted answer.
It's all about where configuration (exclusion) apply: it only applies for test-jar here, as opposed to both test and normal jar in accepted answer. Excluding class files from main jar may not be desired behavior.
2

Using maven-dependency-plugin we can put the resource needed in the right directory, only modifying the pom on dependent project is needed:

<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <phase>generate-test-resources</phase> <goals> <goal>unpack</goal> </goals> <configuration> <artifactItems> <artifactItem> <groupId>dependeeGroupId</groupId> <artifactId>dependeeArtifactId</artifactId> <version>dependeeVersion</version> <type>test-jar</type> <outputDirectory>${project.build.directory}/test-classes</outputDirectory> <includes>resourceNeeded.txt</includes> <overWrite>true</overWrite> </artifactItem> </artifactItems> </configuration> </execution> </executions> </plugin> 

type is used to get test resource
outputDirectory is used to put the resource usable in tests

Documentation here: https://maven.apache.org/plugins/maven-dependency-plugin/unpack-mojo.html

1 Comment

This is actually the cleanest working answer so far. Except that maven-dependency-plugin contains a bug, so <classifier> should be used instead of <type>: stackoverflow.com/questions/65381402/…
0

There is already a goal to build a test jar from maven.

Assuming you need something a little more flexible, you can use the jar plugin to package your test resources and run that goal with the main package goal with something like this.

 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <executions> <execution> <phase>package</phase> <goals> <goal>jar</goal> </goals> <configuration> <classifier>test-resources</classifier> <includes> <include>**/*.whatever-you-want</include> </includes> </configuration> </execution> </executions> </plugin> 

Whatever you want bundled would be added to the project-name-version-test-resources.jar when the jar goal is run.

You could then include it in a project via the same dependency you use above.

1 Comment

Executing the jar goal automatically binds maven-jar-plugin to "classes directory", not "test classes directory". So above will package simply normal classes, and include will not help to all any test resources to the artifact. Sorry, but "-1".

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.