Document ID: /fineweb-2-swissfilter-quality_10-filterrobots/filtered/03454.jsonl.gz/1030

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.