2011-04-29 5 views
2

J'essaie de créer un fichier exécutable avec maven-assembly-plugin avec toutes les dépendances. Je veux les dépendances dans un répertoire/lib/dans le jar, avec le jar principal à l'extérieur, et les fichiers de configuration dans le même niveau du jar principal.Aide pour configurer classpath dans un fichier jar exécutable

Mon pom.xml est:

<plugin> 
       <artifactId>maven-assembly-plugin</artifactId> 
       <version>2.2.1</version> 
       <configuration> 
        <archive> 
        <manifest> 
         <addClasspath>true</addClasspath> 
         <classpathPrefix>lib/</classpathPrefix> 
         <mainClass>org.main.Class</mainClass> 
        </manifest> 
        <manifestEntries> 
         <Class-Path>/ MainClass.jar</Class-Path> 
        </manifestEntries> 
        </archive> 
        <descriptors> 
        <!--Relative path to your descriptor --> 
        <descriptor>src/main/assembly/packagejar.xml</descriptor> 

        </descriptors> 
       </configuration> 
</plugin> 

Le packagejar.xml est:

<id>eval</id> 
    <formats> 
    <format>jar</format> 
    </formats> 
    <includeBaseDirectory>false</includeBaseDirectory> 
    <fileSets> 
    <fileSet> 
     <directory>${project.build.directory}</directory> 
     <outputDirectory>/</outputDirectory> 
     <includes> 
     <include>MainClass.jar</include> 
     </includes> 
    </fileSet> 
    </fileSets> 
    <files> 
    <file> 
     <source>/src/main/resource/logging.properties</source> 
     <outputDirectory>/</outputDirectory> 
    </file> 
    <file> 
     <source>/src/main/resource/log4j.properties</source> 
     <outputDirectory>/</outputDirectory> 
    </file> 
    <file> 
     <source>/src/main/resource/hibernate.cfg.xml</source> 
     <outputDirectory>/</outputDirectory> 
    </file> 
    </files> 
    <dependencySets> 
    <dependencySet> 
     <outputDirectory>/lib/</outputDirectory> 
     <useProjectArtifact>false</useProjectArtifact> 
     <unpack>false</unpack> 
     <scope>runtime</scope> 
    </dependencySet> 
    </dependencySets> 
    </assembly> 

Et le fichier manifest.mf résultant est:

Manifest-Version: 1.0 
Archiver-Version: Plexus Archiver 
Created-By: Apache Maven 
Built-By: German 
Build-Jdk: 1.6.0_22 
Main-Class: org.main.Class 
Class-Path:/MainClass.jar lib/dependency1.jar lib/dependency2.jar etc... 

Avec cela, je obtenir le mainclass à exécuter, mais il ne trouve jamais les jars à l'intérieur de la lib il doit fonctionner. Il me manque probablement quelque chose de basique. J'ai aussi essayé d'ajouter dans le fichier pom.xml manifestEntries un fichier lib/, lib/ .jar,/lib et/lib /.

Des idées?

Merci d'avance.

+0

des mises à jour sur ce ?? Je suis également confronté à ce problème ou n'est-il pas possible de le faire de cette manière. – firefox784

+0

est tombé sur ceci ... un extrait du tutoriel Java ... http://docs.oracle.com/javase/tutorial/deployment/jar/downman.html L'en-tête de chemin de classe pointe vers des classes ou des fichiers JAR sur le réseau local, pas les fichiers JAR dans le fichier JAR ou les classes accessibles via des protocoles Internet. Pour charger des classes dans des fichiers JAR dans un fichier JAR dans le chemin d'accès aux classes, vous devez écrire du code personnalisé pour charger ces classes. Par exemple, si MyJar.jar contient un autre fichier JAR appelé MyUtils.jar, vous ne pouvez pas utiliser l'en-tête Class-Path dans le manifeste de MyJar.jar pour charger des classes dans MyUtils.jar dans le chemin d'accès aux classes. – firefox784

+0

Merci, firefox784. Donc, je suppose que la meilleure façon de publier un fichier exécutable est avec les dépendances dans un répertoire lib en dehors de ce fichier, n'est-ce pas? – greguren

Répondre

1

Référez-vous à Java Tutorial pourquoi cela ne peut pas être fait comme vous le souhaitez. Pour votre question sur la façon de publier un fichier exécutable, c'est une façon possible, mais pas toujours, vous pouvez envoyer des dépendances séparément. Il y a quelques plugins qui construiront votre fichier exécutable avec les dépendances (mais pas comme vous le pensiez). regarder dans OneJAR et Maven Shade. Un fichier JAR crée un fichier jar exécutable avec les dépendances dans un répertoire lib, mais possède des classes de chargeur de classes personnalisées dans le fichier exécutable. Maven shade plugin libère les bibliothèques de dépendances dans le fichier exécutable. J'ai utilisé Maven Shade, parce que j'avais la nécessité de faire quelques transformations lors de la construction de l'exécutable avec les dépendances du printemps.

+0

Merci encore, firefox784! – greguren

Questions connexes