07.03 Einbinden von externen Klassen – Classpath

Objektorientierung bedeutet auch Wiederverwendbarkeit. Aber Wiederverwendbarkeit heißt nicht, dass nützliche Klassen aus dem einen Projekt einfach in ein anderes Projekt kopiert werden. Dies erlaubt die Lizenz auch gar nicht immer. Wiederverwendbarkeit bedeutet vielmehr, dass entweder häufig verwendete Klassen an einer zentralen Stelle abgelegt werden und immer auf diese Klassen referenziert wird, oder dass zumindest externe Programmteile (der besseren Wartbarkeit wegen) getrennt vom eigentlichen Programm mit ausgeliefert werden. Damit Java aber weiß, wo es nach weiteren Klassen suchen muss, müssen Sie den Classpath setzen.

Als Classpath können Ordner (z. B. das Wurzelverzeichnis eines oder mehrerer Packages) oder Dateien (z. B. eine einzelne Klasse ohne Package oder ein JAR-File) gesetzt werden.

In einem (oder mehreren) JAR-File (oder auch JAR-Archiv) kann ein Programm zusammengefasst werden, so dass der Endanwender nicht mehr viele Dateien vor sich liegen hat, sondern nur noch Eine. Außerdem kann dieses JAR-File via Doppelklick wie ein ganz gewöhnliches Programm gestartet werden. JAR-Files und deren Erstellung werden später noch ausführlich behandelt.

Erstellen wir uns zuerst eine kleine, externe Klasse, die wir später in unser Programm einbinden. Diese Klasse liegt in einem Package und stellt lediglich eine simple Methode zur Addition von zwei Integer-Variablen zur Verfügung. An dieser Stelle können wir auch noch einmal die Kompilierung und Ausführung von Java-Dateien wiederholen (siehe Kapitel 01.04.02 Analyse des Quellcodes). Legen Sie sich hierzu an einer beliebigen Stelle ein Projektverzeichnis an. In diesem Verzeichnis erstellen Sie den Ordner de mit dem Unterordner extern. In diesem letzten Unterordner erstellen Sie Ihre Klasse in Form der Datei Addition.java. Die Klasse erhält folgenden Inhalt:

package de.extern;

public class Addition {

  public int addiere(int zahl1, int zahl2) {
    return zahl1 + zahl2;
  }
}

Wechseln Sie jetzt in Ihrer Konsole in das Projektverzeichnis und kompilieren Sie die Klasse mit

javac de/extern/Addition.java

Legen Sie sich nun an einer beliebig anderen Stelle auf Ihrer Festplatte ein weiteres Projektverzeichnis an. Dort erstellen Sie den Ordner de und den Unterordner jbb. Hier erstellen Sie nun eine Klasse mit Main-Methode, die unsere externe Klasse Addition aufruft. Sie könnte z. B. unter dem Namen UseExClass.java gespeichert werden und so aussehen:

package de.jbb;

import de.extern.Addition;

public class UseExClass {

  public static void main(String[] args) {

    Addition add = new Addition();
    System.out.println(add.addiere(5, 10));
  }
}

Sie sehen, dass die Klasse Addition ganz normal importiert werden muss. Kompilieren Sie diese Klasse jetzt ebenfalls auf dem gewohnten Weg mit

javac de/jbb/UseExClass.java

über die Konsole aus Ihrem Projektverzeichnis heraus.

Das Programm lässt sich nicht kompilieren, da die Klasse Addition nicht im Classpath liegt. Sie erhalten eine ähnliche Fehlerausgabe wie diese hier:

de\jbb\UseExClass.java:3: package de.extern does not exist
import de.extern.Addition;
                ^
de\jbb\UseExClass.java:9: cannot find symbol
symbol  : class Addition
location: class de.jbb.UseExClass
    Addition add = new Addition();
    ^
de\jbb\UseExClass.java:9: cannot find symbol
symbol  : class Addition
location: class de.jbb.UseExClass
    Addition add = new Addition();
                       ^
3 errors

An dieser Stelle müssen Sie nun den Classpath setzen. Dies können Sie auf zwei Wege realisieren.

Eine Umgebungsvariable

Sie können sich (synchron zur Umgebungsvariable PATH) die Umgebungsvariable CLASSPATH anlegen, und dort die Verzeichnisse und Dateien spezifizieren, die systemweit berücksichtigt werden sollen. Dies ist aber nicht gerade sauber, da so jedes Programm mit allen externen Bibliotheken „verknüpft“ werden würde.

Werden externe Programmteile verwendet, so nennt man diese auch Bibliotheken, Libraries oder kurz Libs.

Den Classpath für ein Programm setzen

Der weitaus schönere, wenn auch aufwendigere Weg, ist das direkte Setzen des Classpath beim Kompilieren und später auch beim Ausführen eines Programms. Hierzu übergeben Sie javac bzw. java den Parameter -classpath gefolgt vom Verzeichnis bzw. der Datei. Hierbei können sowohl relative als auch absolute Pfade verwendet werden. In unserem Fall müsste der Aufruf wie folgt lauten:

javac -classpath "Pfad/Zum/Projektverzeichnis/von/Addition" de/jbb/UseExClass.java

Diesen Zusatz benötigen wir beim Starten unserer Applikation ebenfalls. Beachten Sie, dass hierbei normalerweise automatisch das aktuelle Verzeichnis im Classpath ist. Durch das explizite Setzen des Classpaths wird selbiger komplett überschrieben, so dass Sie zusätzlich das aktuelle Verzeichnis mit in den Classpath aufnehmen sollten. Hierzu müssen Sie aber nicht den kompletten Pfad zum aktuellen Verzeichnis angeben, da (wie erwähnt) auch ein relativer Pfad genügt. Für das aktuelle Verzeichnis reicht also ein „.“. Wenn Sie mehrere Pfade setzen möchten, werden diese mit einem Semikolon separiert. Es ergibt sich also folgender Aufruf:

java -classpath "Pfad/Zum/Projektverzeichnis/von/Addition";. de.jbb.UseExClass

Wenn Sie JAR-Dateien in den Classpath einsetzen möchten, werden diese ganz gewöhnlich mit einem relativen oder absoluten Pfad gesetzt. Mehr dazu erfahren Sie im entsprechenden Kapitel.

Bootstarp-Classpath

Java hat ein paar Standard-Verzeichnisse in denen nach (System-) Klassen gesucht wird. Diese werden durch den Bootstrap-Classpath spezifiziert und inkludieren standardmäßig u. a. die Klassen im lib-Verzeichnis der JRE und einige JAR-Files in diesem Verzeichnis (u. a. die rt.jar, welche die Standardklassen enthält).

3 Replies to “07.03 Einbinden von externen Klassen – Classpath”

  1. Timo

    Hey Stefan,

    super Anleitung. Allerdings habe ich die Classpathes noch nicht „ganz“ verstanden.

    Ich arbeite mit Eclipse und verwende weitaus mehrere Klassen.
    Solange ich Eclipse einfach diese App starten lasse, funktioniert alles wunderbar.

    Wenn ich die App allerdings selbst kompilieren möchte, funktioniert das nicht. Mein Wunsch:

    Ist es möglich, die Anleitung etwas detaillierter, besonders im Bezug auf „viele Klassen“, zu erweitern? Das wäre super.

    Mfg,
    Timo

  2. Stefan Kiesel

    Hallo Timo,

    wenn Sie viele Klassen im selben Projekt haben, dann benötigen Sie gar keine separierte Classpath-Angabe. Wenn Sie mehrere externe Klassen haben, sollten Sie diese zu einer JAR zusammenfassen. Siehe auch 07.04.04 jar Klassen zusammenfassen. Mehrere einzelne Klassen und/oder JAR-Dateien können Sie ganz normal wie oben beschrieben beim Kompilieren und Ausführen durch Semikolon getrennt angeben.

    Grüße
    Stefan

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.