Search code examples
maven-2

Share test resources between maven projects


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)?


Solution

  • 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>