Maven – Dependency on jar/war package

In Maven, adding dependency is just a piece of cake. Take a look on the following pom.xml.

<project
	xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"
>
	<modelVersion>4.0.0</modelVersion>
	
	<!-- Project Details -->
	<groupId>ykyuen</groupId>
	<artifactId>project-apple</artifactId>
	<packaging>jar</packaging>
	<version>1.0</version>
	<name>project-apple</name>
	
	<dependencies>
		<!-- project-apple depends on project-banana -->
		<dependency>
			<groupId>ykyuen</groupId>
			<artifactId>project-banana</artifactId>
			<version>1.0</version>
		</dependency>
	</dependencies>
</project>

Setting the above dependency is just the same as importing the project-banana.jar in project-apple.

Now i have another Maven web application project called project-orange with packaging type equals to war. Adding the above dependency linkage does not work at all since Java does not see .war file as a classpath. To solve the problem, there is two approaches.


1. Create a Maven module which contains the classes of project-orange with jar packaging. Now you can treat the new Maven module as normal dependency.

2. Configure the maven-war-plugin such that it will build the .jar file when building the .war file. Add the following code under the <project> node of your war project. The following is an example.

	...
	<build>
		<plugins>
			<plugin>
				<artifactId>maven-war-plugin</artifactId>
				<version>2.1.1</version>
				<configuration>
					<attachClasses>true</attachClasses>
					<classesClassifier>classes</classesClassifier>
				</configuration>
			</plugin>
	    </plugins>
	</build>
	...

After running mvn install, you can find the following archive files in the target folder

  • project-orange.war
  • project-orange-classes.jar

Now you can edit the pom.xml of project-apple for adding the new dependency.

<project
	xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"
>
	<modelVersion>4.0.0</modelVersion>
	
	<!-- Project Details -->
	<groupId>ykyuen</groupId>
	<artifactId>project-apple</artifactId>
	<packaging>jar</packaging>
	<version>1.0</version>
	<name>project-apple</name>
	
	<dependencies>
		<!-- project-apple depends on project-banana -->
		<dependency>
			<groupId>ykyuen</groupId>
			<artifactId>project-banana</artifactId>
			<version>1.0</version>
		</dependency>
		<!-- project-apple depends on project-orange -->
		<dependency>
			<groupId>ykyuen</groupId>
			<artifactId>project-orange</artifactId>
			<version>1.0</version>
			<!-- To map the project-orange-classes.jar -->
			<classifier>classes</classifier>
		</dependency>
	</dependencies>
</project>

Done =)

Reference:

Update @ 2011-06-23: update the maven-war-plugin xml. Thanks Sergei Vasilyev. =D

About these ads

17 thoughts on “Maven – Dependency on jar/war package

  1. Paolo

    Thank you very much! I’m a Maven newbie and I was missing the attachClasses feature of the war plugin.

    Reply
  2. Sergei Vasilyev

    Thank you for the pointer. Probably things have changed since v. 2.1-beta-1 of plugin, but Maven kept reporting to me from my dependent project that classes were not found unless I added the “classesClassifier” element to the referenced war project with the “classes” value (in the “configuration” section next to “attachClasses”)

    <plugin>
      <artifactId>maven-war-plugin</artifactId>
      <version>2.1.1</version>
      <configuration>
        <attachClasses>true</attachClasses>
        <classesClassifier>classes</classesClassifier>
      </configuration>
    </plugin>
    
    Reply
  3. kotuboy

    Thanks for the post but i have another problem. I jave resources project-orange.war that i need to run (property file etc.) Currently if I start a class from project-apple, it can not find the resources of orange. What sholud i di?

    Reply
    1. ykyuen Post author

      i am not sure as i haven’t tried that before. but i guess it should work in Maven 1.x as i found the war plugin name in the Maven 1.x project page.
      Maven 1.x

      Reply
  4. Paul

    Thanks very much for this.

    I was struggling with the appfuse warpath plugin for a while, but this approach with the war plugin is perfect and works with m2e as well.

    Reply

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Connecting to %s