Packages Einführung in Java Folie 1 von 18 12. Mai 2011 Ivo Kronenberg Inhalt • Umgang mit Packages • Klassenpfad • Import und Package Klausel • Archive Packages | Ivo Kronenberg 12. Mai 2011 Folie 2 von 18 Motivation • Pro übersetzter Bytecode-Datei (Extension .class): Bytecode einer Klasse • Grosses Programm: Viele Bytecode-Dateien • Organisatorische Probleme: – – – – • Orientierung im Code Bezüge zwischen Klassen Namenskonflikte zwischen gleich benannten Klassen Abgrenzung von Programmteilen Vergleichbar mit Dateien auf einer Festplatte Packages | Ivo Kronenberg 12. Mai 2011 Folie 3 von 18 Packagepfad • Package ist Sammlung von logisch zusammengehörenden Klassen. • Für Pakage-Namen (Bezeichner) gelten die gleichen Regeln wie für Klassen. • Packages sind hierarchisch aufgebaut, sie können verschachtelt werden. • Jedes Package definiert seinen eigenen Namensraum. • Innerhalb eines Packages müssen die Namen von Klassen, Interfaces und Sub-Packages eindeutig sein. Packages | Ivo Kronenberg 12. Mai 2011 Folie 4 von 18 Beispiel eines Packages package ch.sws.projectx; Packagename Trennzeichen von Subpackages ch sw s proj ectx Class1 Packages | Ivo Kronenberg Class2 12. Mai 2011 Folie 5 von 18 Dynamisches Laden von Bytecode • JVM lädt Klassen bei Bedarf , nicht beim Programmstart • Vorteil: Schneller Start, nicht benutzte Klassen werden überhaupt nicht geladen • Bedingung: Bytecode effizient lokalisierbar • Maßnahme: Packagepfad einer Klasse gibt Lage des Bytecodes im Filesystem vor Packages | Ivo Kronenberg 12. Mai 2011 Folie 6 von 18 Abbildung ins Filesystem • Direkte Zuordnung Packagepfad zu Directorypfad im Filesystem • Problem: – Packagenamen sind Java-Identifier – Directorynamen sind Namen des Betriebssystems • Betriebssysteme schränken Directorynamen ein ⇒ Beispiel: Klasse Rational im Package project51.datastore suchen im Directory project51, → Subdirectory datastore, → Datei Rational.class Packages | Ivo Kronenberg 12. Mai 2011 Folie 7 von 18 Klassenpfad • Umgebungsvariable CLASSPATH legt Startdirectory fest, unter dem alle Bytecodedateien gesucht werden • Kompletter Pfadname für eine Bytecodedatei: CLASSPATH + Packagepfad + Klassenname + .class • Beispiel (mit CLASSPATH=/home/developer): /home/developer/project51/datastore/Rational.class Klassenpfad Packages | Ivo Kronenberg Package Klasse 12. Mai 2011 Folie 8 von 18 Alternative Startpunkte • CLASSPATH definiert eine Liste alternativer Startpunkte • Trennzeichen zwischen Listeneinträgen betriebssystemabhängig (Klassenvariable java.io.File.pathSeparatorChar) ; Windows : MacOSX, Linux • Beispiel (Windows): CLASSPATH=.;C:\Userdata\Developers;E:\temp ;C:\My Files • Erster Treffer beendet die Suche, nachfolgende Kandidaten werden ignoriert • Startpunkte werden nacheinander abgesucht ⇒ Reihenfolge der Einträge ist signifikant Packages | Ivo Kronenberg 12. Mai 2011 Folie 9 von 18 Klassenpfad in Eclipse • In den Projekteinstellungen (Tastenkombination Alt+Enter) wird der Klassenpfad für ein Projekt gesetzt. Packages | Ivo Kronenberg 12. Mai 2011 Folie 10 von 18 Organisationsschema • Packagepfad aus Internet-Domainnamen ableiten • Toplevel-Domain liefert oberstes Package, Subdomains untergeordnete Packages • Beispiel: Domainname dieser Fakultät ch.sws • Klassen aus dieser Domain unter dem Packagepfad ch.sws • Weitere Packageorganisation Sache der Projekte Packages | Ivo Kronenberg 12. Mai 2011 Folie 11 von 18 Qualifizierte Namen • Qualifizierter Name = Packagepfad + Package-Element Beispiel: project51.datastore.Rational • Qualifizierte Namen im gesamten Quelltext als Identifier zulässig project51.datastore.Rational r = new project51.datastore.Rational(2, 3); • Syntax qualifizierter Namen ähnelt Elementzugriff, Compiler erkennt zutreffende Bedeutung • Beispiel: java.io.File.pathSeparatorChar zerfällt in – Package java.io – Klasse File – Klassenvariable pathSeparatorChar Packages | Ivo Kronenberg 12. Mai 2011 Folie 12 von 18 Import Klauseln • Klassen sind mit qualifizierten Namen über Packagegrenzen hinweg ansprechbar • Einfacher mit import-Klausel import packagepath.name; Beispiel: import project51.datastore.Rational; Rational p = new Rational(2, 3); • Import aller Klassen eines Packages mit Jokerzeichen import packagepath.*; Beispiel: import project51.datastore.*; Rational p = new Rational(2, 3); Packages | Ivo Kronenberg 12. Mai 2011 Folie 13 von 18 Package Klausel • import-Klauseln regeln Zugriff auf andere Packages • Gegenstück: package-Klausel definiert Packagezugehörigkeit einer Klassendefinition • Syntax package packagepath; • Beispiel: package project51.datastore; class Rational {...} • package-Klausel als Erstes im Quelltext vor import-Klauseln und Definitionen • package-Klausel und Pfad im Filesystem müssen übereinstimmen Packages | Ivo Kronenberg 12. Mai 2011 Folie 14 von 18 Packages – Beispiel package und import Klausel package math.util; import math.number.Complex; import math.number.*; // alle Klassen public class Calculator { public static Complex square(Complex z) { Complex v = new Complex(); v.re = z.re * z.re - z.im * z.im; v.im = z.re * z.im + z.im * z.re; return v; } ... } Packages | Ivo Kronenberg 12. Mai 2011 Folie 15 von 18 Archive • Bytecode in einer gepackten Archivdatei = alternative Organisationsform für Packages • Archivformat Jar (java archive), Dateien = „JarFiles“, Extension .jar • Technisch: Zip-Files mit Erweiterungen • Vorteile gegenüber Directories: – Leicht zusammen zu halten – Kompression für effiziente Übertragung – Metainformation bzgl. Inhalt • Nachteile: – Kein direkter Zugriff auf Bestandteile – Kompression und Expansion kostet Rechenzeit Packages | Ivo Kronenberg 12. Mai 2011 Folie 16 von 18 Archive Anwendung • Packagehierarchie in Jar-Files unverändert • JVM findet Bytecode in Jar-Files • Jar-Files im CLASSPATH: Gleichrangige Eintrittspunkte für Packagepfade CLASSPATH=/somewhere/project51.jar Packages | Ivo Kronenberg 12. Mai 2011 Folie 17 von 18 Archive Metainformationen • Metainformation (= Verwaltungsdaten, Information über das Jarfile) in der Datei META-INF/MANIFEST.MF • Textdatei mit Zeilen der Form name:value • Wird automatisch angelegt mit StandardEinträgen der Art Manifest-Version: 1.0 Created-By: 1.5.0_04 (Sun Microsystems Inc.) • Startklasse im MANIFEST.MF angeben: Main-Class: ch.sws.projectx.Start • Klassenpfad erweitern: Class-Path: name1.jar directory/name2.jar Packages | Ivo Kronenberg 12. Mai 2011 Folie 18 von 18