aberrant80
aberrant80

Reputation: 12997

maven-jar-plugin and transitive dependencies

I'm using both the assembly and jar plugins to deploy my application. I'm also using the jar plugin to help me generate the classpath in the manifest file using

<addClasspath>true</addClasspath>

While that seems to work, the problem comes when I try executing the jar (it has a proper main class specified) - it will fail to locate a library that's actually a transitive dependency. So my project A depends on project B, and project B depends on jar C. The assembly plugin will correctly zip up A, B, and C, but the jar plugin did not include C in the manifest, causing a ClassNotFoundException.

I don't see any options in maven-jar-plugin that lets me specify that transitive dependencies are required.

Am I doing it the right way? Anyone else managed to get transitive dependencies generated into the manifest? Maybe I'm doing something wrongly or out of order. Any help appreciated.

Upvotes: 2

Views: 8107

Answers (3)

Adam Monsen
Adam Monsen

Reputation: 9420

I couldn't get the maven-jar-plugin to work, I had to use the maven-assembly-plugin.

Examples:

Upvotes: 3

aberrant80
aberrant80

Reputation: 12997

I kinda managed to resolve by... not actually resolving it. I checked closer and still don't know why some transitive dependencies aren't getting picked up - it seems to skip of them and they end up not getting generated into the MANIFEST.

I dug around a bit and played with the maven-dependency-plugin. Surprisingly, configuring <attach>true</attach> and tying it to the assembly:assembly phase solved the classpath issue.

Upvotes: 0

Raffael Schmid
Raffael Schmid

Reputation: 339

i tried to solve the mentioned problem. in my case it worked (maven-jar-plugin v2.2). i've got a parent project called jarloading that has 3 childs:

  • main: with dependency to a
  • a: with dependency to b
  • b: with dependency to a

after calling

mvn package

publishing it using a deploy script containing

rm -r ~/Desktop/jarloading-bin
mkdir ~/Desktop/jarloading-bin
cp a/target/a-0.0.1-SNAPSHOT.jar ~/Desktop/jarloading-bin/
cp b/target/b-0.0.1-SNAPSHOT.jar ~/Desktop/jarloading-bin/
cp main/target/main-0.0.1-SNAPSHOT.jar ~/Desktop/jarloading-bin/

changing to directory

cd ~/Desktop/jarloading-bin

and running

java -jar main-0.0.1-SNAPSHOT.jar

it worked fine.


but actually the point is, how the classpath is listed in manifest file:

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: rschmid
Build-Jdk: 1.6.0_07
Main-Class: Main
Class-Path: a-0.0.1-SNAPSHOT.jar b-0.0.1-SNAPSHOT.jar

pom.xml of main project:

...
<build>
    <plugins>
        <plugin>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <index>true</index>
                    <manifest>
                        <mainClass>Main</mainClass>
                        <addClasspath>true</addClasspath>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>
<dependencies>
    <dependency>
        <groupId>ch.fiftynine.lab</groupId>
        <artifactId>a</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
</dependencies>
...

pom.xml of a project:

...
<dependencies>
    <dependency>
        <groupId>ch.fiftynine.lab</groupId>
        <artifactId>b</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
</dependencies>
...

pom.xml of b project contains nothing really special.

and attached source code and binaries: source code binaries

Upvotes: 8

Related Questions