J'essaie de compiler un fichier jar exécutable pour un projet qui fait appel à Hibernate. J'essaie 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 fichier jar final.
Si j'exécute l'ant script je parviens à inclure tous mes jars de bibliothèque, et ils sont mis dans le Root du jar-file final. Lorsque j'exécute le jar-file, j'obtiens un message d'erreur
java.lang.NoClassDefFoundError: org/hibernate/Session
erreur. Si j'utilise l'exportation intégrée vers le jar dans Eclipse, cela ne fonctionne que si je choisis "extraire les bibliothèques requises dans le jar". Mais cela gonfle le jar, et inclut trop de mon projet (par exemple, les tests unitaires).
Voici le manifeste que j'ai généré :
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 du 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 d'un répertoire de bibliothèque lib dans la racine du projet. La variable manifest.classpath prend le classpath de tous ces fichiers jar de la bibliothèque, et les aplatit avec pathconvert et mapper.
J'ai également essayé de définir le classpath du manifeste à ".", "./" et seulement le jar de la bibliothèque, mais sans aucune différence. J'espère qu'il y a un remède simple à mes problèmes...