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

von Bernd, assono GmbH, Standort Hamburg, 05.03.2008

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.

Bernd Hort

Bernd Hort

Diplom-Informatiker, Software-Entwickler & Speaker auf Fachkonferenzen

Bernd Hort ist Expert Digital Business Consultant bei assono. Seit mehr als 20 Jahren entwickelt er erfolgreich individuelle Software-Anwendungen für Unternehmen verschiedener Branchen. Insbesondere in den Bereichen HCL Notes und Domino (ehemals IBM) als auch bei aktuellen, unternehmensrelevanten Themen wie Web-Entwicklung und Web-Architektur, bei Angular-Anwendungen als auch bei progressiven Web-Apps kennt er die neusten Entwicklungen und weiß, wie diese eingesetzt werden können, um den größten Kundennutzen zu erzielen. Aufgrund seines Expertenwissens ist Bernd Hort regelmäßiger Sprecher auf nationalen und internationalen Fachkonferenzen.

Fachbeitrag Entwicklung Java JavaScript

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

Sie haben Interesse an diesem Thema?

Gerne bieten wir Ihnen eine individuelle Beratung oder einen Workshop an.

Kontaktieren Sie uns

Weitere interessante Artikel