Maven test dependency in multi module project
Solution 1
I have a doubt about what you are trying to do but but I'll assume you want to reuse the tests that you have created for a project (module1) in another. As explained in the note at the bottom of the Guide to using attached tests:
Note that previous editions of this guide suggested to use
<classifier>tests</classifier>
instead of<type>test-jar</type>
. While this currently works for some cases, it does not properly work during a reactor build of the test JAR module and any consumer if a lifecycle phase prior to install is invoked. In such a scenario, Maven will not resolve the test JAR from the output of the reactor build but from the local/remote repository. Apparently, the JAR from the repositories could be outdated or completely missing, causing a build failure (cf. MNG-2045).
So, first, to package up compiled tests in a JAR and deploy them for general reuse, configure the maven-jar-plugin
as follows:
<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>
</plugin>
</plugins>
</build>
</project>
Then, install/deploy the test JAR artifact as usual (using mvn install
or mvn deploy
).
Finally, to use the test JAR, you should specify a dependency with a specified type of test-jar
:
<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>
Solution 2
Regarding to my comment to Pascals question i think i have found a stuitable answer :
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<goals>
<goal>test-jar</goal>
</goals>
<phase>test-compile</phase>
</execution>
</executions>
<configuration>
<outputDirectory>${basedir}\target</outputDirectory>
</configuration>
</plugin>
</plugins>
The main difference here as you see here is the <phase>
tag.
I will create the test-jar and it will be available in the compile phase of the tests and not only after the package phase.
Works for me.

user209947
Updated on July 08, 2022Comments
-
user209947 6 months
I use maven to build a multi module project. My module 2 depends on Module 1 src at compile scope and module 1 tests in test scope.
Module 2 -
<dependency> <groupId>blah</groupId> <artifactId>MODULE1</artifactId> <version>blah</version> <classifier>tests</classifier> <scope>test</scope> </dependency>
This works fine. Say my module 3 depends on Module1 src and tests at compile time.
Module 3 -
<dependency> <groupId>blah</groupId> <artifactId>MODULE1</artifactId> <version>blah</version> <classifier>tests</classifier> <scope>compile</scope> </dependency>
When I run
mvn clean install
, my build runs till module 3, fails at module 3 as it couldn't resolve the module 1 test dependency. Then I do amvn install
on module 3 alone, go back and runmvn install
on my parent pom to make it build. How can I fix this? -
Roman over 12 yearsPascal. First of all thanks a lot for answering all the maven questions !! Regarding this question. I have still a problem. I have some testBase class in one of my core modules that i want to use in all of the child objects. We have currenly the maven build in our CI. If i dont want to do any install of deploy to the test-jar and just to check out a fresh copy from trunk and run the mvn test. This fails , since i dont have the test-jar anywhere yet. Any idea how to deal with that ?
-
Devanshu Mevada over 12 years@Roman Running install is the "natural" way. But it looks like you found a workaround.
-
Damien about 12 yearsYes, very convenient. Thanks for sharing. I guess the deploy approach is better only when you have a corporate directory (yes, I know this is strongly recommended). Thanks @Roman
-
Dave over 9 yearsIt seems to be this issue 3559 not 2045 that is the hold up at this point: jira.codehaus.org/browse/MNG-3559
-
Antoniossss almost 3 yearsAltough this explains what is happening it does not provide workaround. It just suggest to do what OP (and eg I) is already doing.