Java: Packages, Classpath, JARs - media.itm.uni- · PDF file• Java-Dateien müssen im...
Transcript of Java: Packages, Classpath, JARs - media.itm.uni- · PDF file• Java-Dateien müssen im...
Vorlesung „Programmieren“
Dr. Dennis Pfisterer
Institut für Telematik, Universität zu Lübeck
http://www.itm.uni-luebeck.de/people/pfisterer
Java: Packages, Classpath, JARs
Packages
Dr. Dennis Pfisterer
Institut für Telematik, Universität zu Lübeck
http://www.itm.uni-luebeck.de/people/pfisterer
• Programme können aus vielen Klassen bestehen– Verschiedene logische Funktionskomponenten
– Müssen nicht von einem Hersteller bzw. Programmierer stammen
Probleme großer Projekte
Programmierer stammen
– Normalerweise besteht ein Programm aus Teilen vieler Programmierer (externe Bibliotheken, Teams, ...)
• Probleme– Klassennamen doppelt vergeben � Eindeutigkeit
– Unklare Zuordnung Funktionseinheit ↔ Klasse
• Wie unterscheidet man die beiden Klassen im gleichen Programm?
• Eine Möglichkeit: umbenennen
– „PunktRGB“ und „PunktKoordinate“
– Macht Programme oft schlechter lesbar (lange Namen)
Beispiel: Zwei „Punkt“-Klassen
– Macht Programme oft schlechter lesbar (lange Namen)
• Beispiele (Windows API, Ungarische Notation)
– RtlWriteDecodedUcsDataIntoSmartLBlobUcsWritingContext
– ConvertSecurityDescriptorToStringSecurityDescriptor
– EapHostPeerQueryUIBlobFromInteractiveUIInputFields
– AccessCheckByTypeResultListAndAuditAlarmByHandle
– SetupRemoveInstallSectionFromDiskSpaceList
Security - 04 Cryptology #5
• Alternative zu langen Namen
• Eingruppieren von Klassen in verschiedene Namensräumen– Unterscheidung von Klassen durch Angabe des Namensraums– Beispiel: Punkt aus „Farbe“ vs. Punkt aus „Mathe“
Namensräume
• Namensräume in Java: sog. „packages“
Security - 04 Cryptology #6
Namensraum „Farbe“ Namensraum „Mathe“
PunktAttribute:
- double x;- double y;
Methoden:
- void setze(double x, double y);- void verschiebe(double dx, double dy);- void rotiere(double radians);
PunktAttribute:
- int rot;- int gruen;- int blau
Methoden:
• Es ist üblich, Klassen in Packages zu gruppieren
– Bessere Übersichtlichkeit
– Vorbeugung von Namenskonflikten
– Zusammengehörige Klassen kennzeichnen
Packages
• Analogie
– Klassennamen sind vergleichbar mit einem Vornamen
– Package-Name entspräche dann dem Familiennamen
• Package-Namen: Gleiche Einschränkungen wie Identifier
– z.B. kein „-“ erlaubt
– Konvention: Kleinschreibung (also „mathe“ statt „Mathe“)
• Namespaces können auch ineinander geschachtelt werden
• Beispiel– Punkt in „Farbe“– Punkt in „rgb“ in „Farbe“– Punkt in „version1“ in „rgb“ in „Farbe“
Nested Namespaces
– Punkt in „version1“ in „rgb“ in „Farbe“– Punkt in „cmyk“ in „Farbe“
Security - 04 Cryptology #9
Namensraum „Farbe“
Namensraum „rgb“
Namensraum „version1“
Namensraum „cmyk“
Punkt PunktPunkt
Punkt
• Einzelne Bestandteile werden durch „.“ getrennt
• Beginnt bei der höchsten Hierarchiestufe– Ähnlich wie im Dateisystem
Nested Namespaces: Java Beispiel
– Ähnlich wie im Dateisystem
– Packages müssen immer „absolut“ angegeben werden (d.h. alle Namensteile müssen vorhanden sein)
Security - 04 Cryptology #10
• Sinnvoll: Weltweit eindeutige Namen
– Üblich sind Internet-Domainnamen in umgekehrter Schreibweise
– Damit man Klassen aus verschiedenen Quellen ohne Namenskonflikte nutzen kann
• Beispiel: Klassen aus dem ITM
Packages: Namenswahl
• Beispiel: Klassen aus dem ITM
– Domainname: itm.uni-luebeck.de
– Package de.uni_luebeck.itm (Verwendung von „_“ statt „-“)
– Sinnvoll: Anhängen des Projektnames (z.B. „programmieren.ws1213.uebung1.aufgabe2“)
– Gesamt: de.uni_luebeck.itm.programmieren.ws1213.uebung1.aufgabe2;
• Java-Dateien müssen im Dateisystem so abgelegt sein, dass deren Pfade die Package-Namen widerspiegeln
– Im folgenden angenommen: Projektverzeichnis ist ~/coding/aufgabe2
• Beispiele für verschiedene Punkt-Klassen (alle jeweils in „Punkt.java“)
– package farbe;
• ~/coding/aufgabe2/farbe/Punkt.java
– package farbe.rgb;
Packages: Dateisystem und Packages
– package farbe.rgb;
• ~/coding/aufgabe2/farbe/rgb/Punkt.java
– package farbe.rgb.version1;
• ~/coding/aufgabe2/farbe/rgb/version1/Punkt.java
– package farbe.cmyk;
• ~/coding/aufgabe2/farbe/cmyk/Punkt.java
– packagemathe;
• ~/coding/aufgabe2/mathe/Punkt.java
– package de.uni_luebeck.itm. programmieren.ws1213.uebung1.aufgabe2;
• ~/coding/aufgabe2/de/uni_luebeck/itm/programmieren/ws1213/uebung1/aufgabe2/Punkt.java
• Zwei Varianten zur Verwendung von Klassen aus anderen Packages
• Angabe des voll-qualifizierten Namens (Klasse + Package)
– package test; ...
Packages: Verwendung
...farbe.rgb.Punkt p = new farbe.rgb.Punkt();
• Importieren bestimmter Klassennamen
– Um die Angabe des voll-qualifizierten zu ersparen (Lesbarkeit)
– Schlüsselwort: import
– import farbe.rgb.Punkt;...Punkt p = new Punkt();
5-3-13
• Kann natürlich auch gemischt verwendet werden
• Beispiel
– package test;
import farbe.rgb.Punkt;
Packages: Verwendung
...
Punkt p1 = new Punkt();
farbe.cmyk.Punkt.Punkt p2 = new farbe.cmyk.Punkt();
farbe.rgb.version1.Punkt p3 =
new farbe.rgb.version1.Punkt();
• Es sind nach wie vor verschiedene Klassen
– Punkt p1 = new farbe.cmyk.Punkt(); //Fehler!!!
5-3-14
• Alternative Variante von import
– Importieren ganzer Packages (z.B. import java.util.*;)
– Alle Namen aus java.util können ohne Angabe des Packages verwendet werden
– Gilt nicht für eventuelle Unterpackages von java.util
Packages: Verwendung
• Wo/wann benutzt man Packages?
– In allen größeren Java-Projekten
– Intensiv in der Java-API: http://download.oracle.com/javase/7/docs/api/(hier sollten sich Java-Programmierer gut auskennen)
• In Java ist java.lang.*; implizit immer importiert
– Daher kann man auch System.out.println(...); statt java.lang.System.out.println(...); schreiben
• In welchem Package waren eigentlich unsere bisherigen Klassen?
• Kein Package: sog. default Package
Klassen ohne Package
• Kein Package: sog. default Package– Quasi ein Package ohne Namen
– Daher liegen diese auch im Wurzelverzeichnis des Projekts
– Sollte man nur bei ganz kleinen Projekten nutzen
Security - 04 Cryptology #16
• Programme können aus vielen Klassen bestehen
– Eigene Klassen im Projektverzeichnis
– Von Java mitgelieferte Klassen (z.B. System, String, ...)
– Klassen von Drittanbietern
Motivation
– ...
• Woher wissen Compiler und VM, wo die Klassen sind?
– Standard: Suche nur im Java-Installationsverzeichnis und im aktuellen Verzeichnis
• Wie funktioniert das mit Packages und wenn nicht alle Klassen im selben Verzeichnis liegen?
– Es müssen ggf. auch andere Verzeichnisse in die Suche einbezogen werden
• Über den Classpath kann man dem Compiler verschiedene „Startpunkte“ für die Suche mitteilen– Von diesen aus sucht Java nach Klassen in verschiedenen
Packages
Lösung: Java Classpath
– Das heißt, dass das Programm über viele Orte „zerstreut“ sein kann
• Verschiedene Möglichkeiten– Standardverhalten
– Umgebungsvariable CLASSPATH
– Kommandozeilenparameter
Security - 04 Cryptology #19
• Angabe aller Suchpfade in der Umgebungsvariablen CLASSPATH
• Windows
– Start | Einstellungen | Systemsteuerung | System | Erweitert | Umgebungsvariablen
Die Umgebungsvariable CLASSPATH
Umgebungsvariablen
– Mehrere Pfade mit ; getrennt auflisten
– Wert der Variablen: .;C:\pfad1\javafiles;D:\pfad2\irgendwo;…
• Linux/Unix
– Mehrere Pfade mit ; getrennt auflisten
– export CLASSPATH=.:/pfad1/javafiles:/pfad2/irgendwo:...(In ~/.bashrc, ~/.profile, ~/bash_profile oder sonstwo)
• Classpath als Kommandozeilenargument übergeben
– Die Umgebungsvariable CLASSPATH wird dann ignoriert
• Auch javac unterstützt „-cp“ und $CLASSPATH
Angabe des Classpath als Argument
• Auch javac unterstützt „-cp“ und $CLASSPATH
– javac übersetzt die angegebenen .java-Dateien
– Classpath wird lediglich zum Einbinden von bereits compilierten Klassen genutzt
Windows:
C:>java –cp .;C:\pfad1\javafiles;D:\pfad2\irgendwo;… PKWTest
Linux:
nutzer@itm:~$ java –cp .:/pfad1/javafiles:/pfad2/irgendwo:… PKWTest
• Angenommen, wir haben 3 Teams– Eins für die farbigen Punkte, eins für die math. Punkte, eins für
das Hauptprogramm
• Jedes Team entwickelt in eigenem Ordner– Team 1: Punkt (Package „mathe“, Ordner „team1“)
– Team 2: Punkt (Package „farbe“, Ordner „team2“)
Beispiel
– Team 1: Main (Package „hauptprogramm“, Ordner „team3“)
• Wie übersetzt man das Programm?– Angabe aller Java-Dateien des Programms:
javac team1\mathe\Punkt.java
team2\farbe\Punkt.java
team3\hauptprogramm\Main.java
– Funktioniert, weil wir nicht andere, bereits compilierteKlassen verwenden
• Wie startet man das Programm?– Nächste Folie
• Startpunkt der Suchpfade: team1, team2 und team3– Angabe entweder relativ zum aktuellen Verzeichnis oder
absolut– Hier: relativ
Besser: Angabe des korrekten Classpath
Security - 04 Cryptology #24
• Mit dem Parameter „-verbose:class“ gibt Java beim Starten aus, welche Klassen er von wo lädt
• Beispiel: java -verbose:class -cp team1;team2;team3 hauptprogramm.Main
Informationen zum Classloading
team1;team2;team3 hauptprogramm.Main
Security - 04 Cryptology #25
• Auch in anderen Programmiersprachen ist das Nachladen normal– Zentrale Updates, Speicherplatzeffizienz, etc.
• Beispiel: Einfaches C Programm
Exkurs: „Classloading“ in C
• Beispiel: Einfaches C Programm
Exkurs: „Classloading“ in CCompilieren und linken in
ausführbare Datei Ausführen
Abhängigkeiten anzeigen
• Zeigt zur Laufzeit in den Addressbereich des Programms „gemappte“ Libraries – Unter Windows: „.dll“, unter Linux/Unix: „.so“
• Java-Programme bestehen aus vielen Klassen
– Jede Klasse hat ein eigenes „.class“-File
– Programme bestehen aus vielen Ordnern und Dateien
– Ausliefern: Zippen, versenden, dort wieder entpacken und starten
JAR Dateien - Motivation
• Einfacher: Class-Dateien in JAR-Archiv zusammenfassen
– JAR: Java Archive
– Im JDK enthalten ist ein Programm namens „jar“ zum Anzeigen, Packen und Entpacken von Jar-Dateien
• JAR-Dateien können direkt in den Classpath eingebunden werden
– Keine Notwendigkeit, JAR-Dateien vor Verwendung auszupacken
• Angabe aller .class Dateien– jar cvf jarfilename.jar Datei1.class ... DateiN.class
• Beispiel: 3 Jars erzeugen (1 pro Team)
JAR Dateien - Erzeugen
• Anstelle einzelner Dateien können Verzeichnisse angegeben werden– jar cvf jarfile.jar verzeichnis
• Vorsicht: Alle Dateien (auch .java Dateien werden hinzugefügt)– Nicht sinnvoll, wenn der Source-Code geheim bleiben soll
– Häufig werden getrennte Jar-Dateien ausgeliefert (Source-Jar, Binary-Jar)
JAR Dateien - Erzeugen
– Häufig werden getrennte Jar-Dateien ausgeliefert (Source-Jar, Binary-Jar)
• Mittels jar: jar tf jarfile.jar
• JAR-Dateien sind normale Zip-Dateien– Können mit allen Zip-Tools bearbeitet werden
JAR Dateien – Inhalt anzeigen
• Problem: Man muss die Klassen mit dem richtigen Pfad ins JAR-File bekommen
• Möglichkeit: jar cvf programm.jar team1 team2 team3– Funktioniert nicht � team1, team2, team3 sind nicht Teil der Packagenamen
Wie bekommt man alle Klassen in ein Jar?
Security - 04 Cryptology #35
• Alternative: Erzeugen und subsequentes Aktualisieren eines Jar-Files
• Erzeugen des Jar-Files – jar cvf programm.jar -C team1 mathe/Punkt.class
• „-C team1“ wechselt in das Verzeichnis vor dem Suche und Hinzufügen
– jar uvf programm.jar -C team2 farbe/Punkt.class• „u“ statt „c“: Update des Files anstelle von Create
Wie bekommt man alle Klassen in ein Jar?
• „u“ statt „c“: Update des Files anstelle von Create
– jar uvf programm.jar -C team3 hauptprogramm/Main.class
Security - 04 Cryptology #36
• Können in Classpath aufgenommen werden– java –cp team1.jar;team2.jar;team3.jarhauptprogramm.Main
• Müssen dazu nicht entpackt werden
JAR-Dateien verwenden
• Müssen dazu nicht entpackt werden
• Zum Starten von Java-Anwendungen muss man den Namen der Hauptklasse kennen
– Also der mit der main-Methode
– Sehr unschön für Anwender
JAR-Dateien verwenden
– Sehr unschön für Anwender
• In Jar-Dateien kann diese Angabe direkt integriert werden
– Über die sogenannte Manifest Datei (MANIFEST.MF)
– Damit wird die JAR-Datei direkt ausführbar
• Manifest-Datei mit folgendem Inhalt erstellen:– Main-Class: voller.name.der.Klasse
• Beispiel– Main-Class: hauptprogramm.Main
JAR-Dateien verwenden: Manifest
• Dazu legt man eine Datei an, die das Manifest enthält– Beispiel: manifest.txt
– Inhalt: „Main-Class: hauptprogramm.Main“ (Enter danach nicht vergessen)
• Als Jar verpacken: – jar cvmf manifest.txt jardatei.jar <klassen>
Reihenfolge von m und f ist wichtig!
• jar cvmfmanifest.txt programm.jar -C team1 mathe/Punkt.class• jar uvf programm.jar -C team2 farbe/Punkt.class• jar uvf programm.jar -C team3 hauptprogramm/Main.class
Manifest: Beispiel
• Die Manifest-Datei kann noch einiges mehr– z.B. den Classpath der Anwendung setzen
– ...
Manifest
• Weitere Informationen zum Manifest– http://docs.oracle.com/javase/tutorial/deployment/jar/manifestindex.html
Security - 04 Cryptology #42
• Mit Packages kann man die Anwendung besser strukturieren– Vermeidet Namenskonflikte
– Erlaubt prägnantere Namen
– Gruppiert zusammengehörige Klassen
• Classpath bestimmt Suchpfad für Java
Zusammenfassung
• Classpath bestimmt Suchpfad für Java– Mehrere Möglichkeiten (Default, Umgebungsvariable, Kommandozeilenparameter,
Manifest-Datei)
• Jar-Dateien– Erlaubt zusammenfassen einer Anwendung oder eines Teils (z.B. Library) zu einer Datei
– Können Teil des Classpath sein
– Können über Manifest-Datei weitere Angaben zum Programm enthalten (z.B. die Hauptklasse)
Security - 04 Cryptology #43