Der Classpath ist ein Parameter, der eine Liste von Verzeichnissen, JAR- und ZIP-Archiven definiert, in denen die Java-Maschine und der Compiler nach Klassen und Ressourcen beim Starten einer Anwendung suchen.
Hintergrund:
Seit der Einführung von Java gab es die Notwendigkeit, das Laden einer großen Anzahl von Klassen zu organisieren, die oft in verschiedenen Verzeichnissen liegen. Dazu wurde der Classpath erfunden, der es ermöglicht, flexibel die Suchorte für Abhängigkeiten anzugeben.
Problem:
Wenn der Classpath falsch konfiguriert ist, findet die Anwendung die benötigten Klassen nicht, was zu Ladefehlern führen kann (z. B. ClassNotFoundException oder NoClassDefFoundError).
Lösung:
Der Classpath kann über die Umgebungsvariable CLASSPATH, den Befehlszeilenparameter -cp oder -classpath angegeben werden. Es ist wichtig, alle Verzeichnisse und JAR-Dateien anzugeben, die für die Ausführung der Anwendung erforderlich sind. Beispiel für den Start mit Classpath:
java -cp ".;lib/*" com.example.Main
Wichtige Merkmale:
; (Windows) oder : (Linux/macOS) angegeben werdenlib/* — alle JARs im Ordner libKann Java Klassen selbst finden, wenn sie nicht im Classpath angegeben sind?
Nein, Java führt keine automatische Suche nach Klassen außerhalb des angegebenen Classpaths durch. Jeder Pfad muss ausdrücklich angegeben oder im Build- oder Startschritt hinzugefügt werden.
Beeinflusst die Reihenfolge der Pfade im Classpath das Laden von Klassen?
Ja, bei Konflikten mit Klassennamen wird die Klasse des zuerst angegebenen Pfades bevorzugt. Die Reihenfolge ist wichtig, um Versionskonflikte zu vermeiden.
Kann man ein neues JAR "on-the-fly" zum Classpath hinzufügen, nachdem die Anwendung gestartet wurde?
Nein, der Standardmechanismus für den Classpath ist nach dem Start der JVM statisch. Die dynamische Ladung neuer Klassen erfordert spezielle ClassLoader.
Eine Java-Anwendung wird mit dem Parameter -cp lib/mylib.jar gestartet, wobei der Ordner mit der Testkonfiguration vergessen wird. Infolgedessen stürzt die Anwendung mit einem Fehler ab, obwohl die Bibliothek anscheinend vorhanden ist.
Vorteile:
Nachteile:
Es wird maven/gradle verwendet, die den Classpath basierend auf den Abhängigkeiten selbst erstellen. Der Start erfolgt über ein Wrapper-Skript.
Vorteile:
Nachteile: