2011-01-13 19 views
1

Ich entwickle eine Anwendung in Eclipse und es läuft gut aus innerhalb von Eclipse. Das Problem, das ich habe ist, dass, wenn ich es in eine JAR-Datei exportieren und es über die Befehlszeile ausführen, ich einen NoClassDefFound-Fehler für javax.mail.internet bekomme.java.lang.NoClassDefFoundError in der Befehlszeile

In meinem Projekt Build Pfad und Klassenpfad habe ich die Bibliotheken activation.jar und mail.jar enthalten, die für die Verwendung von javax.mail.internet benötigt werden, und wie ich schon sagte, funktioniert es innerhalb von Eclipse, aber nicht wenn ich exportiere es in ein Glas. Wenn mein Build-Pfad diese Dateien enthält und auch mein Klassenpfad, warum würde das nicht funktionieren? Hier

ist der Fehler-Stack: Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: javax/mai l/internet/InternetAddress at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.setPressed(Unknown Source) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Sour ce) at java.awt.Component.processMouseEvent(Unknown Source) at javax.swing.JComponent.processMouseEvent(Unknown Source) at java.awt.Component.processEvent(Unknown Source) at java.awt.Container.processEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Window.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source) Caused by: java.lang.ClassNotFoundException: javax.mail.internet.InternetAddress at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) ... 27 more

+0

ist der Platz in '... javax/mai l/internet ...' ein Copy/Paste oder Ausgabe Interleave Problem? –

+0

Ja, ein Kopier-/Einfüge-Problem. – Graham

Antwort

2

Wow Ich fühle mich wie ein kompletter Idiot. Alles, was Sie tun müssen, ist beim Exportieren in eine JAR-Datei anstatt "JAR-Datei" in Eclipse wählen Sie "Runnable JAR File" und dann sagen, dass es die erforderlichen Bibliotheken darin zu packen, um es klein zu halten und wa-la, alles funktioniert gut .

Weitere Optionen ist diese Zeile in der Manifest-Datei hinzufügen, wenn das Glas erstellt wird: Class-Path: lib/mail.jar

Und dann haben nur einen Ordner lib mit mail.jar in es im gleichen Ordner, die die exportierten Glas wird sei in. Boom.

Die frühere Option ist meiner Meinung nach die beste.

0

Eine Möglichkeit wäre, dass etwas, das Klasse, Paket javax.mail ist abhängig von (auch bekannt als transitive Abhängigkeit) fehlt. Aber ich würde zuerst Klassenpfad überprüfen; Die ausführbare Java-Befehlszeile zeigt keine fehlenden Verzeichnisse (oder nicht vorhandene referierte JARs) an - Ich habe manchmal Semikolon und Doppelpunkt als Pfadtrennzeichen verwechselt, und dies führt dazu, dass Klassen nicht gefunden werden.

Eine nette Sache JDK 1.6 schließlich Fähigkeit Platzhalter definieren musste, war, so dass Sie tun können:

java -cp lib/\* 

(Backslash zitieren Sternchen verwendet, um Unix-Shell nicht erweitern)

das würde schließe alle jars aus dem Verzeichnis 'lib /' ein; Damit müssen Sie nicht alle einzelnen Dateien in diesem Verzeichnis manuell hinzufügen.

+0

Es ist definitiv in meinem Klassenpfad, hier sind die Einträge hier: \t ' \t ' – Graham

+0

Nein ist es nicht, sonst würdest du diese Ausnahme nicht bekommen. Diese Bibliothekseinträge sind für die Eclipse-Kompilierungs- und Ausführungsumgebung und nicht für Ihre eigenständige Umgebung. Das ist der Grund, warum es in Eclipse funktioniert. Sie müssen den Klassenpfad auf einen Ordner setzen, in dem sich Ihre Bibliotheken befinden. – eglobetrotter

+0

Ich habe sie hinzugefügt, indem ich sie einzeln von der Java-Website heruntergeladen habe, sie in meinen lib-Ordner gestellt und sie dann dem Build-Pfad des Projekts hinzugefügt habe. Sie werden in der Manifestdatei des exportierten Jars überhaupt nicht angezeigt. Sie werden jedoch im lib-Ordner im Jar angezeigt. Was fehlt mir hier? – Graham

1

Dies ist fast sicher ein Klassenpfadproblem. Versuchen Sie, die exportierte JAR-Datei zu öffnen (über winzip, oder umbenennen in eine .zip-Datei und Windows) und untersuchen Sie die verfälschte Ordnerstruktur, um festzustellen, ob "javax/mail/internet /" vorhanden ist und die InternetAddress.class-Datei darin enthalten ist. Oder öffnen Sie die Datei MANIFEST.MF, die sich in der JAR befindet, um festzustellen, ob sie einen Klassenpfadeintrag enthält und die im Manifest angegebenen JAR-Dateien an den durch das Manifest angegebenen Speicherorten vorhanden sind.

Bearbeiten: Untersuchen Sie Ihren Laufzeitklassenpfad, indem Sie ihn aus der Systemeigenschaft in der JVM drucken.

System.out.println(System.getProperty("java.class.path")); 

Ich glaube, Sie werden es finden fehlt, sorry Sie durch die zusätzliche Arbeit der manuellen Inspektion gehen zu machen, aber es ist manchmal aufschlussreich.

In der Regel sind JAR-Dateien nicht in einem Glas enthalten. Es gibt zwei Möglichkeiten eine ausführbare jar zu exportieren:

  1. Jar Klassendateien und beinhalten ein Manifest, das den Classpath gibt an, wo die JVM andere Bibliotheken in Bezug auf Ihre eigenen finden.
  2. Rütteln Sie Ihre Klassendateien zusammen mit dem Inhalt anderer Gläser in einem einzigen Glas. Dies ist wahrscheinlich das, was Sie wollen, und Sie können dies erreichen, indem Sie den Assistenten "export ...> Runnable JAR File" von eclipse verwenden. Stellen Sie sicher, dass Sie "Runable JAR File" verwenden und wählen Sie die richtigen Laufkonfigurationen aus.

Sie finden könnte dies SO relevante Frage: Classpath including JAR within a JAR

+0

@Graham, bitte sehen Sie meine Änderungen. Ich verstehe nicht ganz, wie du denkst, dass du den Klassenpfad spezifizierst. Wenn ich Ihre Situation richtig verstanden habe, müssen Sie ändern, wie Sie von Eclipse exportieren. Der Link am Ende erklärt, warum ein Glas in einem Glas nicht funktioniert. –

0

hinzufügen mail.jar zu Classpath, und stellen Sie sicher, dass Ihr Startverzeichnis der Eltern von lib ist (letzteres scheint die wahrscheinlichste Ausgabe). Sie können Ihre Hauptmethode w/smth wie starten:

System.getProperties().store(System.out, "boot props"); 
Verwandte Themen