Pakete in Java

Small logo of ETH main building ETH Zurich : Computer Science : Pervasive Computing : Distributed Systems : Education : I2 SS2004

Pakete in Java

Während der Vorlesung sind zum Thema Pakete noch einige Fragen aufgetaucht, deshalb hier ein kleiner Überblick.

Müssen die Dateien, die zu einem gemeinsamen Paket gehören, im gleichen Verzeichnis stehen?

Ja. Es gibt ein paar Ausnahmen, aber um die brauchen Sie sich hier nicht zu kümmern. Generell bezeichnet ein Paketname gleichzeitig auch das Verzeichnis, wo die Source-Dateien des Pakets stehen (bzw. die bereits kompilierten .class-Dateien). Eine Klasse IntList im Paket vorlesung muss in der Datei IntList.java in dem Verzeichnis vorlesung stehen.

Nun gibt es, ähnlich dem Suchpfad in der Unix-Shell, eine Umgebungsvariable, in der angegeben wird, in welchen Verzeichnissen nach Paketen gesucht werden soll. Wenn diese nicht gesetzt ist, nimmt Java dafür das gegenwärtige Verzeichnis (.) an und zusätzlich den Standardpfad, wo alle Java-Klassen (wie z.B. java.util.Random) liegen. Das heisst, wenn man im gegenwärtigen Verzeichnis ~/java in einer Klasse Test die eben besprochene Klasse IntList benutzen möchte (hier der Source-Code Test.java):

import vorlesung.IntList;
public class Test {

    public static void main(String[] args) {
        IntList l=new IntList();
    //...
    }

}


dann muss sich das Paket mit der Klasse IntList eben relativ dazu im Unterverzeichnis ~/java/vorlesung befinden.

Generell gilt: Die Klassen der Pakete müssen in entsprechend dem Paketnamen benannten Unterverzeichnissen, die aus dem Suchpfad (Umgebungsvariable CLASSPATH) erreichbar sind, liegen.

Wie kann man die main-Methode einer Klasse in einem Paket aufrufen?

Nehmen wir an, die Klasse IntList hätte auch eine main-Methode, zum Testen der Funktionalität von IntList. Dann kann man diese auch nur  von ausserhalb des Paketverzeichnisses vorlesung aufrufen. Wenn man sich im Verzeichnis ~/java/vorlesung befindet, passiert folgendes:

chfrank@tardis-b01:~/java> cd vorlesung
chfrank@tardis-b01:~/java/vorlesung>java IntList
Exception in thread "main" java.lang.NoClassDefFoundError: IntList (wrong name: vorlesung/IntList)
at java.lang.ClassLoader.defineClass0(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:495)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:110)
....

Wichtig ist die erste Zeile "wrong name:...". Dadurch, dass die Klasse IntList zum Paket vorlesung gehört, hat sie den vollen Namen vorlesung.IntList bekommen, und muss eben, relativ zum gegenwärtigen Pfad, unter vorlesung/IntList.java zu finden sein. Aus dem Verzeichnis ~/java ist ein Aufruf wie folgt möglich: 


chfrank@tardis-b01:~/java>java vorlesung.IntList
Hallo!

Müssen die Dateien einen bestimmten Namen haben, wenn darin ein Paket definiert wird?

Nein, jede Datei muss den Namen der Klasse tragen, die darin implementiert ist: IntList.java für die Klasse IntList. In dieser Datei können dann auch weitere Hilfsklassen definiert werden (z.B. Elemente einer Liste etc.). Diese können dann aber nicht von ausserhalb importiert werden, sondern nur innerhalb des Paketes genutzt werden (d.h. von Klassen im gleichen Verzeichnis).

Was ist mit den Java-internen Klassen?

Für diese gelten obige Regeln ebenso. Grundsätzlich sucht Java auch in seiner eigenen Klassenhierarchie nach Paketen, wie z.B. nach der Klasse Random im Paket java.util (wobei hier util ein Unterpaket von java ist und im entsprechenden Unterverzeichnis liegen muss). Das Paket java.lang wird standardmässig importiert und somit lassen sich die Klassen String oder auch System ohne import Anweisung benutzen. Informationen zu der Paketstruktur der Java-Klassen finden Sie in der Java-API.

Wenn Sie z.B. auf Ihrem eigenen Rechner Java installiert haben, und dabei die Installation der Java-Sources verlangt haben, können sie sich im Java-Installationsverzeichnis die entsprechenden Source-Files von z.B. von den Klassen String oder Random anschauen.

ETH ZurichDistributed Systems Group
Last updated August 23 2010 01:54:12 PM MET