2009-07-06 9 views
1

J'utilise à la fois l'assembly et les plugins jar pour déployer mon application. Je suis également en utilisant le plugin pot pour me aider à générer le classpath dans le fichier manifeste en utilisantmaven-jar-plugin et dépendances transitives

<addClasspath>true</addClasspath> 

Bien que cela semble fonctionner, le problème vient quand je tente d'exécuter le pot (il a une classe principale appropriée spécifiée) - il échouera à localiser une bibliothèque qui est en fait une dépendance transitive. Donc mon projet A dépend du projet B, et le projet B dépend de jar C. Le plugin assembly va correctement compresser A, B et C, mais le plugin jar n'a pas inclus C dans le manifeste, provoquant une exception ClassNotFoundException.

Je ne vois aucune option dans maven-jar-plugin qui me permet de spécifier que les dépendances transitives sont requises.

Est-ce que je le fais de la bonne façon? Quelqu'un d'autre a réussi à obtenir des dépendances transitives générées dans le manifeste? Peut-être que je fais quelque chose à tort ou dans le désordre. Toute aide appréciée.

Répondre

0

J'ai réussi un peu à résoudre par ... pas résoudre réellement.J'ai vérifié de plus près et je ne sais toujours pas pourquoi certaines dépendances transitives ne sont pas ramassées - il semble les ignorer et elles finissent par ne pas être générées dans le MANIFEST. Je ai creusé un peu et joué avec le plugin maven-dépendances. Étonnamment, en configurant <attach>true</attach> et en l'attachant à la phase assembly:assembly a résolu le problème de classpath.

5

J'ai essayé de résoudre le problème mentionné. dans mon cas cela a fonctionné (maven-jar-plugin v2.2). j'ai un projet parent appelé jarloading qui a 3 Childs:

  • principale: avec la dépendance à un
  • a: avec la dépendance à b
  • b: avec la dépendance à un

après avoir appelé

mvn package 

la publication à l'aide d'un script contenant Déployez

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/ 

changer le répertoire

cd ~/Desktop/jarloading-bin 

et en cours d'exécution

java -jar main-0.0.1-SNAPSHOT.jar 

il a bien fonctionné.


mais en fait le point est, comment le classpath est listé dans le fichier manifeste:

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 du projet principal:

... 
<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 de un projet:

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

pom.xml de b projet ne contient rien de vraiment spécial.

et le code source et les binaires ci-joint: source code binaries

+0

+1 pour l'effort pour me aider avec un échantillon! Merci! – aberrant80