views:

2462

answers:

3

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.

+2  A: 

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

rschmid
+1 for the effort in helping me with a sample! Thanks!
aberrant80
A: 

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.

aberrant80
+1  A: 

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

Examples:

  • Brian Fox's Blog (this is the one I followed)
  • Maven Assembly Plugin Usage Guide (can't post a link)
  • similar example by Scott Leberknight (can't post a link)

stackoverflow told me "sorry, new users can only post a maximum of one hyperlink"

Adam Monsen