Java: Option -jar beim Aufruf des Java-Interpreters ignoriert den Classpath

von Bernd Hort,
assono GmbH, Standort Hamburg,

java_logo.gif Diese Erkenntnis hat mich einige Kopfschmerzen gekostet. wink.gif  Damit es anderen nicht auch so geht, sind hier die Details.

Zunächst als Erklärung zur Option -jar beim Aufruf von java.exe. Wenn in einem Projekt mehrere Java-Klassen benötigt werden, so können sie zusammen in einer komprimierten Datei gespeichert werden. Eine solche Datei ist im Prinzip eine ZIP-Datei mit der Dateiendung JAR. Damit der Java-Interpreter (java.exe) weiß, welche der Klassen er beim Aufruf direkt ausführen soll, existiert in der JAR-Datei ein so genanntes Manifest. Mit
java.exe -jar MyProject.jar
wird also Java so aufgerufen, dass in der JAR-Datei nach dem Manifest gesucht wird und die dort angegebene Klasse aufgerufen wird.

Wenn ich in Versionen vor Notes 8 eine Kundenanforderung mit Standard-Notes-Mitteln nicht umsetzen kann, greife ich gerne zu Java. Bisher habe ich dann einfach meinen Code in eine JAR-Datei gepackt und im Verzeichnis [Notes-Programmpfad]\jvm\lib\ext abgelegt. (Wir haben in unserem Framework einen Mechanismus, der solche Erweiterungen automatisch beim Öffnen einer Datenbank auf dem Rechner des Anwenders verteilt.) Wenn die JAR-Datei in diesem Verzeichnis liegt, spielt der Klassenpfad (Classpath) keine Rolle, weil der Java-Interpreter automatisch in diesem Verzeichnis sucht.

Nur hatte in einer Kundenumgebung die Anwender kein Schreibrecht auf das Verzeichnis [Notes-Programmpfad]\jvm\lib\ext. Insofern mussten wir die JAR-Datei in einem anderen Verzeichnis ablegen. Weil das Java-Programm zwar aus dem Notes Client heraus aufgerufen werden sollte, aber nicht als Java-Agent gestartet werden sollte, wurde der Java-Interpreter direkt aufgerufen. Allerdings führte das zu der schönen Fehlermeldung
Exception in thread "main" java.lang.NoClassDefFoundError: de/assono/demo/AnotherPackage
Der Java-Interpreter konnte also eine benötige Klasse nicht finden, die sich in einer anderen JAR-Datei befand.

Die erste Überlegung war, dass wir vergessen hatten, den Klassenpfad zu setzen. Eine Änderung des Aufrufs in
java.exe -jar -classpath ".;c:\temp\MyProject.jar; c:\temp\AnotherPackage.jar;" MyProject.jar
brachte leider keine Verbesserung.

Nach einer etwas längeren Google-Recherche bin ich dann in der Java-Dokumentation fündig geworden.

-jar
...
When you use this option, the JAR file is the source of all user classes, and other user class path settings are ignored.

Die Lösung war dann relativ einfach.
Mit der einfachen Zeile

Class-Path: AnotherPackage.jar

im Manifest kann der Klassenpfad angegeben
werden. Die Details stehen in einem Sun Tutorial.

Fachbeitrag JavaScript Java Entwicklung

Sie haben Fragen zu diesem Artikel? Kontaktieren Sie uns gerne: blog@assono.de

Sie wollen eine individuelle Lösung? Kontaktieren Sie uns

Weitere interessante Artikel

Sie haben Fragen? Wir sind für Sie da.

Wenn Sie mehr über unsere Angebote erfahren möchten, können Sie uns jederzeit kontaktieren. Sie können uns auf verschiedene Weisen für eine unverbindliche Erstberatung erreichen:

assono GmbH

Standort Kiel (Zentrale)
assono GmbH
Lise-Meitner-Straße 1–7
24223 Schwentinental

Standort Hamburg
assono GmbH
Bornkampsweg 58
22761 Hamburg

Telefonnummern:
Zentrale: +49 4307 900 407
Techn. Hotline: +49 4307 900 403
Vertrieb: +49 4307 900 402

E-Mail-Adressen:
kontakt@assono.de
bewerbung@assono.de