2010-04-22 8 views
2

Je suis en train de compiler un fichier JAR exécutable pour un projet qui utilise Hibernate. J'essaye de construire un fichier ant build.xml pour rationaliser mon processus de construction, mais j'ai des problèmes avec l'inclusion de hibernate3.jar dans le dernier fichier jar.Y compris les dépendances jar hibernate dans la construction ant

Si je lance le script ant, j'arrive à inclure tous mes jarres de bibliothèques, et ils sont placés dans la racine finale du fichier jar. Quand je lance le pot-fichier, je reçois un

java.lang.NoClassDefFoundError: org/hibernate/Session 
erreur

. Si je fais usage de l'exportation intégrée à jar dans Eclipse, cela ne fonctionne que si je choisis "extraire les bibliothèques requises dans le pot". Mais cela bloque le pot, et comprend trop de mon projet (c'est-à-dire des tests unitaires).

Ci-dessous mon généré manifeste:

Manifest-Version: 1.0 
Main-Class: main.ServerImpl 
Class-Path: ./ antlr-2.7.6.jar commons-collections-3.1.jar dom4j-1.6.1.jar 
hibernate3.jar javassist-3.9.0.GA.jar jta-1.1.jar slf4j-api-1.5.11.jar 
slf4j-simple-1.5.11.jar mysql-connector-java-5.1.12-bin.jar rmiio-2.0.2.jar 
commons-logging-1.1.1.jar 

Et la partie de l'build.xml ressemble à ceci:

<target name="dist" depends="compile" description="Generates the Distribution Jar(s)"> 
    <mkdir dir="${dist.dir}" /> 
    <jar destfile="${dist.dir}/${dist.file.name}.jar" basedir="${build.prod.dir}" filesetmanifest="mergewithoutmain"> 
     <manifest> 
      <attribute name="Main-Class" value="${main.class}" /> 
      <attribute name="Class-Path" value="./ ${manifest.classpath} " /> 
      <attribute name="Implementation-Title" value="${app.name}" /> 
      <attribute name="Implementation-Version" value="${app.version}" /> 
      <attribute name="Implementation-Vendor" value="${app.vendor}" /> 
     </manifest> 
     <zipfileset refid="hibernatefiles" /> 
     <zipfileset refid="slf4jfiles" /> 
     <zipfileset refid="mysqlfiles" /> 
     <zipfileset refid="commonsloggingfiles" /> 
     <zipfileset refid="rmiiofiles" /> 
    </jar> 
</target> 

Les refids' pour les zipfilesets pointent vers les répertoires dans un répertoire de bibliothèque lib à la racine du projet. La variable manifest.classpath prend le chemin de classe de tous ces fichiers jar de bibliothèque, et les aplatit avec pathconvert et mapper.

J'ai également essayé de mettre le classpath manifeste à ".", "./" et seulement le pot de bibliothèque, mais à aucune différence du tout. J'espère qu'il y a un remède simple à mes problèmes ...

Répondre

2

Puisque vous ne pouvez pas spécifier jar-inside-jar dans votre classpath, cette manière ne fonctionnera pas. Vous devez soit Jar seulement votre code puis zip votre pot avec des pots de libs et script de lancement, comme

(ce que la plupart des gens), ou vous pouvez déballer tous vos pots lib au même dir qui contient vos classes compilées puis jar résultat rép dans le fichier jar unique (ce que maven jar-with-dépendances emballage faire).

+0

Merci pour la clarification. Je suis allé avec l'option de décompresser tous les jars lib dans mon répertoire de construction et de réemballer toutes les classes avec les classes de projet. J'ai utilisé zipfileset: , mais existe-t-il un moyen plus simple d'inclure plusieurs fichiers jar dans un répertoire plutôt que d'appeler un fichier zip? pour chaque jar-fichier que je veux inclure? – Patrick

+0

vous pouvez toujours écrire sh script qui fera quelque chose comme 'jar xf * jar; jar cf my-app-avec-libs.jar * '. Encore, je recommanderais la 1ère approche - zip qui sera auto-décompressé et lancé en accompagnant le script shell. En utilisant la 2ème approche, vous devez prendre soin des classes avec le même FQCN de différentes bibliothèques, le cas échéant. –

+0

Ok, merci beaucoup pour l'aide. Je suis allé avec l'option de pointer le classpath manifeste vers un sous-dossier lib d'accompagnement où j'ai copié tous les fichiers jar nécessaires, et cela fonctionne très bien maintenant. – Patrick