| 

.NET C# Java Javascript Exception

1
Hallo,

ich bin gerade dabei mit Hilfe von Eclipse eine Java-Anwendung am schreiben welche unter anderem die externe Bibliothek Joda-Time nutzt.
Zur Entwicklungszeit ist dies auch soweit kein Problem. Wenn ich das Program jedoch extern ausführen möchte, erhalte ich Fehlermeldung welche darauf zurückzuführen sind, dass die Anwendung die Bibliothek (das JAR File) nicht findet.

java.lang.NoClassDefFoundError


Nun Frage ich mich, was ich tun muss um die Bibliothek richtig einzubinden. Wenn ich mich recht erinnere kann ich beim Starten der Anwendung einen Pfad mitgeben an dem gesucht werden soll, damit er die entsprechende JAR Datei auch findet. Allerdings frage ich mich ob es nicht einen simpleren Weg gibt, wie z.B. den, dass das JAR File immer in dem ausführenden Verzeichnis gesucht wird.
News:
25.08.2014
Slashi 409 2 8
1 Antwort
2
Es geht da tatsächlich um einen Pfad, nämlich den sogenannten Classpath. Dort sucht die Java-Runtime nach den Joda-Klassen, und Du bekommst die Fehlermeldung, weil das Joda-Jar nicht im Classpath steht. Zur Entwicklungszeit kümmert sich Deine IDE darum, den Classpath zu setzen. Später mußt Du das selbst tun. Eine Übersicht über die verschiedenen Möglichkeiten, die Du dabei hast, findest Du in der Oracle-Doku.

Wie Du schon vermutet hast, könntest Du den Classpath beim Start der Anwendung als Kommandozeilen-Option setzen:

java -classpath someDir\lib1.jar;someOtherDir\lib2.jar your.package.YourClass

Tippfaule (und das sind wir doch alle, oder?) schreiben sich das in ein kleines bat-File.

Aber Du fragst, ob das auch einfacher geht. Ja, geht es. (Disclaimer: ab hier zitiere ich letztlich die Doku, weil ich schon ewig Java nur noch in Webanwendungen verwende und deshalb mit der Kommandozeile kaum noch zu tun habe. Sprich: ich habe das meiste nicht selbst ausprobiert.)

Zum einen gibt es seit Java 6 die Möglichkeit, Wildcards zu verwenden. Mit

java -classpath ./* your.package.YourClass

ziehst Du Dir alle Jars im aktuellen Verzeichnis (aber nicht in Unterverzeichnissen) in den Classpath. Falls Dir das so gut gefällt, daß Du es immer so nutzen willst, kannst Du das auch in die Umgebungsvariable CLASSPATH schreiben und dann die -classpath-Option weglassen (die ansosnten die Variablen-Vorgabe überschreiben würde).

Falls Du Deine Anwendung in ein Jar verpackst, kannst Du im Manifest des Jar einen Classpath eintragen (evtl. hat Deine IDE ein Tool dafür). Dann mußt Du ihn nicht jedesmal beim Start angeben, sondern kannst die Anwendung einfach über

java -jar yourApp.jar

starten. Natürlich mußt Du dafür sorgen, daß die erwartete Verzeichnisstruktur vorhanden ist.

Und schließlich kannst Du den Java-Extension-Mechanismus nutzen: Jars, die im Ordner lib\ext der verwendeten JRE liegen, werden automatisch eingebunden, auch wenn sie nicht im Classpath angegeben sind. Da das aber zum einen Admin-Rechte erfordert, zum anderen alle Java-Anwendungen beeinflußt, kommt das nur selten in Frage. Bei Joda-Time könnte ich mir das evtl. noch vorstellen, aber Du hast vermutlich auch noch andere Jars, die Du einbinden willst und die nicht allen Java-Anwendungen auf Deinem Rechner zur Verfügung stehen sollen.
28.08.2014
Matthias Hlawatsch 13,2k 4 9
Danke Matthias, damit habe ich nun auch die etwas - wie ich finde umständlich formulierte - Dokumentation verstanden. :-)
Slashi 09.09.2014

Stelle deine Java-Frage jetzt!