43
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

Java: Packages, Classpath, JARs - media.itm.uni- · PDF file• Java-Dateien müssen im Dateisystem so abgelegt sein, dass deren Pfade die Package-Namen widerspiegeln – Im folgenden

  • Upload
    lamtram

  • View
    225

  • Download
    1

Embed Size (px)

Citation preview

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

Beispiel: Zwei „Punkt“-Klassen

Security - 04 Cryptology #4

• 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“)

Packages: Beispiel

Security - 04 Cryptology #8

• 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

ClasspathClasspath

• 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

Wie es nicht geht...

Security - 04 Cryptology #23

• 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“

JAR DateienJAR Dateien

• 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

„jar“-Tool: Verwendung

• 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

JAR Dateien mit ZIP-Tool 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

„Ausführen“ einer Jar-Datei

Security - 04 Cryptology #41

• 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