Ant Problem - oder Wie baue ich eine "FatJar"

Gambler79

Grünschnabel
Hallo,

ich habe in meinem Netbeans-Projekt Ant ein "FatJar" gebaut. Das hat auch funktioniert. Leider kann ich das Jar nicht ausführen, bzw. es läuft nicht richitg. Es kommen keine ClassNotFound-Exceptions oder irgendeine andere Exception. Ich habe auch schon mit dem Classpath herumexperimentiert. Hat aber auch nichts gebracht. Hat noch irgendeiner ne Idee warum das Programm ohne irgendeine Meldung einfach durchläuft oder abbricht? ...

Vielen Dank
 
Hi,
Java sucht beim ausführen deines JARs in der Manifest Datei /META-INF/manifest.mf nach der auszuführenden main Klasse. Diese wird im Property 'Main' definiert. (http://openbook.galileocomputing.de/javainsel8/javainsel_28_004.htm)
Ansonsten könnte es noch sein das dir andere Libs fehlene die du in deinem Programm nutzt. Dazu bräuchte man mal einer deiner ClassNotFoundExceptions um das weiter einzugrenzen.
Du musst darauf achten das sämtliche benutzen libs im classpath verfügbar sind.

vg,
ck.
 
Es gibt einen ganz interessanten ANT Task um ein richtiges "FatJar" zu bauen. Der Task baut dir ein Jar in dem alle zur runtime benötigten Jars mit reingepackt werden.

http://one-jar.sourceforge.net/

Im build.xml musst du gar nicht mal viel machen, den Task einbinden:

XML:
<property name="one-jar.dist.dir" value="./lib/compile/" />
<property name="one-jar.version" value="0.96" />

<path id="oneJar.Classpath">
    <pathelement location="${basedir}/lib/one-jar-ant-task-${one-jar.version}.jar" />
</path>
<taskdef name="one-jar" classname="com.simontuffs.onejar.ant.OneJarTask" classpathref="oneJar.Classpath" />

Dann noch fix ein Manifest anlegen:

XML:
<echo file="${build.dist}/${build.distname}.mf" append="false">
Manifest-Version: 1.0
Specification-Title: ${build.distname}
Main-Class: com.simontuffs.onejar.Boot
One-Jar-Main-Class: com.mypackage.MainClass
</echo>

Letzlich der Aufruf von dem OneJar Task:

XML:
<one-jar destfile="${build.dist}/${build.distname}-standalone.jar" manifest="${build.dist}/${build.distname}.mf">
    <main>
        <fileset dir="${build.classes}">
            <include name="**/**" />
        </fileset>
    </main>
    <lib>
        <fileset dir="./lib/runtime">
            <include name="**/*.jar" />
         </fileset>
    </lib>
</one-jar>

Viele Grüße
f.
 
Zuletzt bearbeitet von einem Moderator:
Zurück