Fatjar und lustige Classloaderprobleme mit Ant
zeeman | 11. November 2009Neues Projekt, neuer Spaß:
Da das Logging auch lokalisiert sein soll, bietet sich ja cal10n an. Super Sache, ist ja auch schnell integriert.
Trotzdem soll es ja, für die "Normalsterblichen", eine einfache Distribution geben. Simples Logging und verpackt in einer JAR-Datei.
Soweit so toll, irgendwie erinnert man sich ja an FatJar: Alle JARs werden in ein JAR zusammengepackt und fertig.
Soweit der Plan. Das Projekt ist auch schnell gefunden und das build-File angepasst.
Leider ist das Projekt für die Ant-Integration etwas suboptimal angepast. Aber prinzipiell reicht normales Ant-Wissen und das browsern durch die FatJar-Lib um die richtigen Parameter zu finden:
-
<taskdef name="fatjar.build" classname="net.sf.fjep.anttask.FJBuildTask" classpath="${fjepPath}"/>
-
<typedef name="fatjar.manifest" classname="net.sf.fjep.anttask.FJManifestType" classpath="${fjepPath}"/>
-
<typedef name="fatjar.exclude" classname="net.sf.fjep.anttask.FJExcludeType" classpath="${fjepPath}"/>
-
<typedef name="fatjar.jarsource" classname="net.sf.fjep.anttask.FJJarSourceType" classpath="${fjepPath}"/>
-
<typedef name="fatjar.filesource" classname="net.sf.fjep.anttask.FJFileSourceType" classpath="${fjepPath}"/>
Mit dem passenden Target
-
<target name="dist-simple" depends="compile">
-
<fatjar .build output="${ant.project.name}-simple.jar">
-
<fatjar .filesource path="bin" relpath="" />
-
<fatjar .manifest mainclass="com.foo.bar" />
-
<fatjar .jarsource file="lib/cal10n-api-0.7.jar" relpath="" />
-
<fatjar .jarsource file="lib/jul-to-slf4j-1.5.9-RC0.jar" relpath="" />
-
<fatjar .jarsource file="lib/slf4j-api-1.5.9-RC0.jar" relpath="" />
-
<fatjar .jarsource file="lib/slf4j-ext-1.5.9-RC0.jar" relpath="" />
-
<fatjar .jarsource file="dist/slf4j-simple-1.5.9-RC0.jar" relpath="" />
-
</fatjar>
-
</target>
hat Ant aber so seine Probleme:
BUILD FAILED
build.xml:54: typedef class net.sf.fjep.anttask.FJManifestType cannot be found
Lösung des Problems:
Ant verwendet verschiedene Classloader wie hier und hierbeschrieben.
Lösung des Problems ist also:
-
<property name="ant.reuse.loader" value="true"/>
-
<path id="fatJarPath" location="dist/fatjar.jar" />
-
<taskdef name="fatjar.build" classname="net.sf.fjep.anttask.FJBuildTask" classpathref="fatJarPath" />
-
<typedef name="fatjar.manifest" classname="net.sf.fjep.anttask.FJManifestType" classpathref="fatJarPath" />
-
<typedef name="fatjar.exclude" classname="net.sf.fjep.anttask.FJExcludeType" classpathref="fatJarPath" />
-
<typedef name="fatjar.jarsource" classname="net.sf.fjep.anttask.FJJarSourceType" classpathref="fatJarPath" />
-
<typedef name="fatjar.filesource" classname="net.sf.fjep.anttask.FJFileSourceType" classpathref="fatJarPath" />
Ach ja:
Es sollte noch erwähnt werden, dass immer ein manifest-Eintrag angegeben sein muss. Andernfalls regnet es NullPointerExceptions.
Also ein leerer Manifest-Tag und gut ist.










