2009-06-06 6 views
4

Ich habe eine Klasse, die in einem Paket namens com.toptur.sysTray sitzt, alles, was es tut, ist System Tray laden es keine externen Pakete verwendet. Ich erstelle ein SysTray-Objekt, um die Taskleiste zu installieren. Alles ist in Ordnung. Ich kann die Anwendung von der Befehlszeile ausführen und Systray wird installiert. Aber wenn ich versuche, ein Jar aus den Klassendateien zu erstellen und es auszuführen, bekomme ich NoClassDefFoundError.NoClassDefFoundError in jar

Paket und seine Klassendateien befinden sich im Jar meiner Anwendung verwendet keine ant externe Gläser. nur Klassen, die von Java bereitgestellt werden.

Und wenn Sie eine .exe-Datei aus dem Jar erstellen, beginnt es wieder ohne Fehler zu arbeiten.

Wie kann ich das aufspüren?

<target name="jar" depends=""> 
    <jar destfile="build/toptur.jar" > 
    <manifest> 
     <attribute name="Built-By" value="Toptur"/> 
     <attribute name="Main-Class" value="gotacan"/> 
    </manifest> 
    <fileset dir="build"> 
     <include name="**/*.class"/> 
    <include name="**/*.png"/> 
<exclude name="**/*.jar"/> 
    </fileset> 
</jar> 

i erstellen Sie die JAR-Datei von einer Ameise Ziel über Code. Treiberprogramm ist nicht in einem Paket enthalten. seinen Sitz in gotacan.java

ich es mit java -jar laufen toptur.jar

Rest des Programms funktioniert es Ausnahme nur wirft, wenn ich versuchen, dieses Paket zu verwenden.

+0

Wie erstellen Sie Ihre JAR-Datei und wie tun Sie laufen es? – kgiannakakis

+0

Können Sie den gesamten NoClassDefFound Stack-Trace anzeigen? –

+1

heißt Ihre Klasse wirklich "gotacan" mit einem Kleinbuchstaben Anfangsbuchstaben? – Billy

Antwort

1

Ich vermute, dass in Ihrem Manifest entweder die Hauptklassenbezeichnung fehlt, ein Klassenpfad, oder das Jar den Paketverzeichnispfad nicht korrekt enthält.

A tutorial könnte helfen. Ihr klingt einfach genug, wo es eine kleine Sache ist, die Sie übersehen haben.

UPDATE: Der Name der Hauptklasse muss der vollständig aufgelöste Klassenname sein, einschließlich des vollständigen Pakets. Wenn Ihre Klasse in einem Paket enthalten ist, sind Sie dort falsch gelaufen.

+0

Hauptkassette ist nicht in einem Paket. Rest der Komponenten sind. Jede andere Klasse ist gut gelöst, außer diesem einzigen. Alle Pakete befinden sich im com.toptur-Ordner –

3

Die Ausnahme Klasse nicht gefunden sollte den Namen der gesuchten Klasse angeben.

Da Sie nur das Glas auf dem Klassenpfad haben, sollte es im Glas sein, aber es ist nicht. Herauszufinden, warum, mögliche Gründe:

  • die Klassendatei nicht ist, wo es gehört, wenn ant das Paket den Paketnamen
  • die Verzeichnisstruktur baut darstellt, wird nicht verwurzelt, in der alle anderen Klassen verwurzelt sind
  • die Der Ort, an dem die Klassendatei liegt, ist nicht in der Liste der Dateien enthalten, die von ant in das Glas gelegt werden sollen.

Good Luck

Hinweis: Gläser werden zip nur Dateien mit einer Haltung, so dass Sie jede Zip-Programm verwenden können, um zu überprüfen, welche Dateien tatsächlich da drin sind.

+0

Er kann auch einfach jar xvf toptur.jar von der Kommandozeile verwenden, um das jar zu extrahieren. –

+0

true (unter der Annahme, dass die Parameter korrekt sind), aber nur wenige wissen das auswendig, während fast jeder Entwickler mindestens ein Zip-Tool verwendet –

+0

Beachten Sie auch, dass eine einzelne Klasse abhängig von der Klassenzusammensetzung mehrere .class-Dateien generieren kann. –

0

Wahrscheinlich hängt von der JRE ab, mit der Sie das Programm mit der JVM ausführen, die Sie verwenden, um es zu erstellen, und die .exe mit zu erstellen.

Systray Funktionalität ganz neu ist (Java6), also, wenn Sie einige alte JRE oder JVM auf dem Systempfad, wenn Sie laufen

java -jar toptur.jar 

Es kann die Klasse, die Sie geschrieben, aber nicht die Klassen dass es von der JRE verwendet wird.

0

Ich hatte ein ähnliches Problem, als ich versuchte, ein Glas mit Ant für ein Open-Source-Projekt zu machen.

Ich kam in Kontakt mit den Autoren, und sie verwendeten stattdessen Eclipse, um das Glas zu exportieren. Ich ahmte nach, was sie vorschlugen und fand einen deutlichen Unterschied in der Größe der Jar-Dateien. Ich habe nicht die Zeit genutzt, um den Unterschied festzustellen, der dazu führte, dass einer arbeitete und der andere nicht. Sie können jedoch einen ähnlichen Prozess verwenden, um Ihre Arbeit richtig zu machen. Wenn ja, vielleicht kann man den Unterschied sehen und das Ergebnis mit uns teilen :)

Das folgende ist ein Link zu meinem Problem und die Lösung: Xerces-for-Android NoClassDefFoundError When Using Jar Instead of Source Code