blob: cc82ea5363dca5330fbf9c2233c0e5c9dc36676f [file] [log] [blame]
------
How to create a jar containing test classes
------
Karl Heinz Marbaise
------
2014-06-16
------
~~ Licensed to the Apache Software Foundation (ASF) under one
~~ or more contributor license agreements. See the NOTICE file
~~ distributed with this work for additional information
~~ regarding copyright ownership. The ASF licenses this file
~~ to you under the Apache License, Version 2.0 (the
~~ "License"); you may not use this file except in compliance
~~ with the License. You may obtain a copy of the License at
~~
~~ http://www.apache.org/licenses/LICENSE-2.0
~~
~~ Unless required by applicable law or agreed to in writing,
~~ software distributed under the License is distributed on an
~~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
~~ KIND, either express or implied. See the License for the
~~ specific language governing permissions and limitations
~~ under the License.
~~ NOTE: For help with the syntax of this file, see:
~~ http://maven.apache.org/doxia/references/apt-format.html
How to create a jar containing test classes
When you want to create a jar containing <test-classes>, you would probably want to reuse those classes.
There are two ways to solve this:
* Create an attached jar with the <test-classes> from the current project and loose its transitive <<<test>>>-scoped dependencies.
* Create a separate project with the <test-classes>.
[]
* The easy way
You can produce a jar which will include your test classes and resources.
+-----------------+
<project>
...
<build>
<plugins>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>${project.version}</version>
<executions>
<execution>
<goals>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>
...
</plugins>
</build>
...
</project>
+-----------------+
To reuse this artifact in an other project, you must declare this dependency with type test-jar :
+-----------------+
<project>
...
<dependencies>
<dependency>
<groupId>groupId</groupId>
<artifactId>artifactId</artifactId>
<classifier>tests</classifier>
<type>test-jar</type>
<version>version</version>
<scope>test</scope>
</dependency>
</dependencies>
...
</project>
+-----------------+
Based on such configuration there will be two jar files generated. The first one contains the
classes from <<<src/main/java>>> whereas the second one will contain the classes from <<<src/test/java>>>.
The generated jar files follow the naming schema <<<artifactId-version.jar>>> for the first one and
<<<artifactId-version-classifier.jar>>> for the second one. The parts <<<artifactId>>>, <<<versions>>>
will be replaced by the values given within your project <<<pom.xml>>> file. The <<<classifier>>>
will be set to <<<tests>>> which is a default of the maven-jar-plugin which can be changed if you need by
{{{../test-jar-mojo.html}using the configuration in the jar goal}}.
<<Note:>> The downside of this solution is that you don't get the transitive <<<test>>>-scoped dependencies automatically.
Maven only resolves the <<<compile>>>-time dependencies, so you'll have to add all the other required <<<test>>>-scoped dependencies by hand.
* The preferred way
In order to let Maven resolve all <<<test>>>-scoped transitive dependencies you should create a separate project.
+-----------------+
<project>
<groupId>groupId</groupId>
<artifactId>artifactId-tests</artifactId>
<version>version</version>
...
</project>
+-----------------+
* Move the sources files from <<<src/test/java>>> you want to share from
the original project to the <<<src/main/java>>> of this project.
The same type of movement counts for the resources as well of course.
* Move the required <<<test>>>-scoped dependencies and from the original
project to this project and remove the scope (i.e. changing it to the <<<compile>>>-scope).
And yes, that means that the junit dependency (or any other testing
framework dependency) gets the default scope too. You'll probably need
to add some project specific dependencies as well to let it all compile again.
Now you have your reusable <test-classes> and you can refer to it as you're used to:
+-----------------+
<project>
...
<dependencies>
<dependency>
<groupId>groupId</groupId>
<artifactId>artifactId-tests</artifactId>
<version>version</version>
<scope>test</scope>
</dependency>
</dependencies>
...
</project>
+-----------------+