Programmieren in Java -...

39
Programmieren in Java Vorlesung 12: Metawissen Java Bibliotheken, Maven Robert Jakob Albert-Ludwigs-Universit¨ at Freiburg, Germany SS 2013 Robert Jakob (Univ. Freiburg) Programmieren in Java JAVA 1 / 33

Transcript of Programmieren in Java -...

Page 1: Programmieren in Java - proglang.informatik.uni-freiburg.deproglang.informatik.uni-freiburg.de/.../slides/v12-classpath-jar-maven.… · $ java -jar calculator.jar Angabe von Classpath

Programmieren in JavaVorlesung 12: MetawissenJava Bibliotheken, Maven

Robert Jakob

Albert-Ludwigs-Universitat Freiburg, Germany

SS 2013

Robert Jakob (Univ. Freiburg) Programmieren in Java JAVA 1 / 33

Page 2: Programmieren in Java - proglang.informatik.uni-freiburg.deproglang.informatik.uni-freiburg.de/.../slides/v12-classpath-jar-maven.… · $ java -jar calculator.jar Angabe von Classpath

Inhalt

Java Bibliotheken

Maven

Robert Jakob (Univ. Freiburg) Programmieren in Java JAVA 2 / 33

Page 3: Programmieren in Java - proglang.informatik.uni-freiburg.deproglang.informatik.uni-freiburg.de/.../slides/v12-classpath-jar-maven.… · $ java -jar calculator.jar Angabe von Classpath

Java Bibliotheken

Bibliotheken

I Sammlung von Paketen und deren Klassen

I Losungen fur thematisch zusammengehorendes Problem

I Selbst nicht ausfuhrbar

Robert Jakob (Univ. Freiburg) Programmieren in Java JAVA 3 / 33

Page 4: Programmieren in Java - proglang.informatik.uni-freiburg.deproglang.informatik.uni-freiburg.de/.../slides/v12-classpath-jar-maven.… · $ java -jar calculator.jar Angabe von Classpath

Java Bibliotheken

Beispiel

Bibliothek:

package simpleMath;

public class Arith {public static int add(int x, int y) { ... }public static int sub(int x, int y) { ... }}

Programm:

package calculator;

// Uses package from libraryimport simpleMath.Arith;

public class Calculator {public static void main(String[] args) { ... }

Robert Jakob (Univ. Freiburg) Programmieren in Java JAVA 4 / 33

Page 5: Programmieren in Java - proglang.informatik.uni-freiburg.deproglang.informatik.uni-freiburg.de/.../slides/v12-classpath-jar-maven.… · $ java -jar calculator.jar Angabe von Classpath

Java Bibliotheken

Bibliotheken in Java

I Java Archive: JAR

I Zip-Dateien mit Metainformationen

Inhalt eines JAR:

I Ordner(packages) mit Klassen (.class) und/oder Quellen (.java)

I Ordner META INF mit Metainformationen

I Resourcen (Bilder, . . . )

Ausschnitt einer Jar-Datei:

| − META−INF\ MANIFEST.MF

\ − simpleMath\ Arith.class

Robert Jakob (Univ. Freiburg) Programmieren in Java JAVA 5 / 33

Page 6: Programmieren in Java - proglang.informatik.uni-freiburg.deproglang.informatik.uni-freiburg.de/.../slides/v12-classpath-jar-maven.… · $ java -jar calculator.jar Angabe von Classpath

Java Bibliotheken

Das Jar-Tool

Kommandozeilentool jar

I Anzeigen der Inhalte eines Jar:$ jar tf simpleMath.jar

I Entpacken eines Jar:$ jar xf simpleMath.jar

I Erzeugen eines Jar$ jar cf simpleMath.jar simpleMath

Erzeugen in Eclipse: Projektexport > Java > Jar file

Robert Jakob (Univ. Freiburg) Programmieren in Java JAVA 6 / 33

Page 7: Programmieren in Java - proglang.informatik.uni-freiburg.deproglang.informatik.uni-freiburg.de/.../slides/v12-classpath-jar-maven.… · $ java -jar calculator.jar Angabe von Classpath

Java Bibliotheken

Aufruf eines Java Programms

Einfacher Aufruf eines Java-Program (Eclipse > Run):$ java calculator.Calculator

I Main-Methode von calculator.Calculator soll aufgerufen werden

I Classfile wird erwartet unter

\ − calculator\ Calculator.class

Robert Jakob (Univ. Freiburg) Programmieren in Java JAVA 7 / 33

Page 8: Programmieren in Java - proglang.informatik.uni-freiburg.deproglang.informatik.uni-freiburg.de/.../slides/v12-classpath-jar-maven.… · $ java -jar calculator.jar Angabe von Classpath

Java Bibliotheken

Aufruf mit Bibliotheken

Mit Verwendung von Jars:

I Angabe wo Klassen bzw. Jars zu suchen sind: Classpath

I Angaben: CLASSPATH oder Argument zum java Aufruf

$ java -cp arith.jar:. calculator.Calculator

Classpath:

I Pakete und Klassen in arith.jar

I Pakete und Klassen im Verzeichnis .

Aufruf innerhalb von Eclipse:Show View, Debug, Debug, Properties auf Prozess

Robert Jakob (Univ. Freiburg) Programmieren in Java JAVA 8 / 33

Page 9: Programmieren in Java - proglang.informatik.uni-freiburg.deproglang.informatik.uni-freiburg.de/.../slides/v12-classpath-jar-maven.… · $ java -jar calculator.jar Angabe von Classpath

Java Bibliotheken

Einbinden einer Bibliothek in ein Eclipseprojekt

I Copy and Paste (JAR liegt im Repository)

I Add External Jar (Absoluter Pfad im .classpath)

I User Library (Namensreferenz im Workspaces)

Robert Jakob (Univ. Freiburg) Programmieren in Java JAVA 9 / 33

Page 10: Programmieren in Java - proglang.informatik.uni-freiburg.deproglang.informatik.uni-freiburg.de/.../slides/v12-classpath-jar-maven.… · $ java -jar calculator.jar Angabe von Classpath

Java Bibliotheken

Metadaten

Meta-Daten in MANIFEST.MF (Ausschnitt):

I Ausfuhrbare Klasse/Ausfuhrbares Jar

I Versionsnummer

I Versiegelte Klassen

I Sicherheit

Robert Jakob (Univ. Freiburg) Programmieren in Java JAVA 10 / 33

Page 11: Programmieren in Java - proglang.informatik.uni-freiburg.deproglang.informatik.uni-freiburg.de/.../slides/v12-classpath-jar-maven.… · $ java -jar calculator.jar Angabe von Classpath

Java Bibliotheken

Ausfuhrbares JAR

META-INF/MANIFEST.MF:

Manifest−Version: 1.0

Main−Class: calculator.Calculator

Datei muss mit Newline enden!

I Setzen der ausfuhrbaren Klassen beim Erzeugen:$ jar cfe calculator.jar calculator.Calculator

calculator

I Ausfuhren:$ java -jar calculator.jar

Angabe von Classpath nicht moglich!

Eclipse: Export Jar File, Angabe der Main-Class.

Robert Jakob (Univ. Freiburg) Programmieren in Java JAVA 11 / 33

Page 12: Programmieren in Java - proglang.informatik.uni-freiburg.deproglang.informatik.uni-freiburg.de/.../slides/v12-classpath-jar-maven.… · $ java -jar calculator.jar Angabe von Classpath

Java Bibliotheken

Ausfuhrbares JAR

META-INF/MANIFEST.MF:

Manifest−Version: 1.0

Main−Class: calculator.Calculator

Datei muss mit Newline enden!

I Setzen der ausfuhrbaren Klassen beim Erzeugen:$ jar cfe calculator.jar calculator.Calculator

calculator

I Ausfuhren:$ java -jar calculator.jar

Angabe von Classpath nicht moglich!

Eclipse: Export Jar File, Angabe der Main-Class.

Robert Jakob (Univ. Freiburg) Programmieren in Java JAVA 11 / 33

Page 13: Programmieren in Java - proglang.informatik.uni-freiburg.deproglang.informatik.uni-freiburg.de/.../slides/v12-classpath-jar-maven.… · $ java -jar calculator.jar Angabe von Classpath

Java Bibliotheken

Versionsinformationen

Name: calculatorSpecification−Title: My CalculatorSpecification−Version: 1.2Specification−Vendor: My Company, IncImplementation−Title: My CalculatorImplementation−Version: build57Implementation−Vendor: Example Tech, Inc.

Robert Jakob (Univ. Freiburg) Programmieren in Java JAVA 12 / 33

Page 14: Programmieren in Java - proglang.informatik.uni-freiburg.deproglang.informatik.uni-freiburg.de/.../slides/v12-classpath-jar-maven.… · $ java -jar calculator.jar Angabe von Classpath

Java Bibliotheken

Sealing Packages in JARs

I Idee: Sicherstellung, dass alle Inhalte eines Paketes aus einem Jarkommen.

I Vermeidung von Konflikten beim verwenden mehrere Jars.

Name: simpleMath/Sealed: True

Hinweis: Package muss mit / enden!

Robert Jakob (Univ. Freiburg) Programmieren in Java JAVA 13 / 33

Page 15: Programmieren in Java - proglang.informatik.uni-freiburg.deproglang.informatik.uni-freiburg.de/.../slides/v12-classpath-jar-maven.… · $ java -jar calculator.jar Angabe von Classpath

Java Bibliotheken

Signieren von JARs

Basiert auf Public-Private-Key Kryptographie1

1Details siehe Vorlesung Internetsecurity.Robert Jakob (Univ. Freiburg) Programmieren in Java JAVA 14 / 33

Page 16: Programmieren in Java - proglang.informatik.uni-freiburg.deproglang.informatik.uni-freiburg.de/.../slides/v12-classpath-jar-maven.… · $ java -jar calculator.jar Angabe von Classpath

Java Bibliotheken

Verifizieren

Nutzer der Bibliothek:

Robert Jakob (Univ. Freiburg) Programmieren in Java JAVA 15 / 33

Page 17: Programmieren in Java - proglang.informatik.uni-freiburg.deproglang.informatik.uni-freiburg.de/.../slides/v12-classpath-jar-maven.… · $ java -jar calculator.jar Angabe von Classpath

Java Bibliotheken

Probleme mit Jars

I Sichtbarkeit, Schnittstellen, erforderliche Pakete, dynamischesLaden/Entfernen → OSGi-Bundles

I Versions- und NamenskonflikteI NoSuchMethodExceptionI ClassNotFoundException

I Abhangigkeitsverwaltung → Maven

Robert Jakob (Univ. Freiburg) Programmieren in Java JAVA 16 / 33

Page 18: Programmieren in Java - proglang.informatik.uni-freiburg.deproglang.informatik.uni-freiburg.de/.../slides/v12-classpath-jar-maven.… · $ java -jar calculator.jar Angabe von Classpath

Maven

Java Bibliotheken

Maven

Robert Jakob (Univ. Freiburg) Programmieren in Java JAVA 17 / 33

Page 19: Programmieren in Java - proglang.informatik.uni-freiburg.deproglang.informatik.uni-freiburg.de/.../slides/v12-classpath-jar-maven.… · $ java -jar calculator.jar Angabe von Classpath

Maven

Maven - Was ist das?

Anwendungsbereiche:

I KompilierungQuelltext → Verteilung

I ProjektmanagementQuelltext → Websites, Berichte, . . .

Wofur ist das gut?Vereinfacht Verwaltung von Java-Projekten mit Abhangigkeiten

Robert Jakob (Univ. Freiburg) Programmieren in Java JAVA 18 / 33

Page 20: Programmieren in Java - proglang.informatik.uni-freiburg.deproglang.informatik.uni-freiburg.de/.../slides/v12-classpath-jar-maven.… · $ java -jar calculator.jar Angabe von Classpath

Maven

Convention over Configuration

I Standardeinstellungen sind ausreichend fur “normalen” GebrauchI In Maven:

I Verzeichnisse fur Quelltext, TestsI Verzeichnisse fur AusgabeI Namensgebung der AusgabedateienI Vorgefertigter Lebenszyklus (life-cycle)

I Erweiterung durch PluginsI Compiler (maven-compiler-plugin)I Unit Tests (maven-surefire-plugin)I Code Coverage (maven-emma-plugin)I Viele mehr

Robert Jakob (Univ. Freiburg) Programmieren in Java JAVA 19 / 33

Page 21: Programmieren in Java - proglang.informatik.uni-freiburg.deproglang.informatik.uni-freiburg.de/.../slides/v12-classpath-jar-maven.… · $ java -jar calculator.jar Angabe von Classpath

Maven

Projektmodel

Project Object Model (POM)Kennzeichen:

I Abhangigkeiten zu anderen Projekten (Dependency Managment)

I Orte anderer Projekte (Repositories)

I Wiederverwendbarkeit der Build Logik

I Portierbarkeit und Integration (Eclipse, Netbeans,. . . )

I Suchen nach Projekten und deren Metainformationen (Nexus2)

2https://repository.apache.org/Robert Jakob (Univ. Freiburg) Programmieren in Java JAVA 20 / 33

Page 22: Programmieren in Java - proglang.informatik.uni-freiburg.deproglang.informatik.uni-freiburg.de/.../slides/v12-classpath-jar-maven.… · $ java -jar calculator.jar Angabe von Classpath

Maven

Projektmodel als XML

I pom.xml als Projektbeschreibungsdatei

I Informationen die nicht den Standardeinstellungen entsprechen

<project><modelVersion>4.0.0</modelVersion><groupId>de.uni freiburg.informatik.proglang</groupId><artifactId>myproject</artifactId><version>1.0−SNAPSHOT</version>

</project>

Robert Jakob (Univ. Freiburg) Programmieren in Java JAVA 21 / 33

Page 23: Programmieren in Java - proglang.informatik.uni-freiburg.deproglang.informatik.uni-freiburg.de/.../slides/v12-classpath-jar-maven.… · $ java -jar calculator.jar Angabe von Classpath

Maven

Project Object Model

I Super POM3

Basis fur alle POM

I Einfachstes POM

<project><modelVersion>4.0.0</modelVersion><groupId>de.uni freiburg.informatik.proglang</groupId><artifactId>myproject</artifactId><version>1.0−SNAPSHOT</version>

</project>

I Effektives POMmvn help:effective-pom

3http://books.sonatype.com/mvnref-book/reference/

pom-relationships-sect-pom.html#ex-super-pomRobert Jakob (Univ. Freiburg) Programmieren in Java JAVA 22 / 33

Page 24: Programmieren in Java - proglang.informatik.uni-freiburg.deproglang.informatik.uni-freiburg.de/.../slides/v12-classpath-jar-maven.… · $ java -jar calculator.jar Angabe von Classpath

Maven

Project Object Model

I Super POM3

Basis fur alle POM

I Einfachstes POM

<project><modelVersion>4.0.0</modelVersion><groupId>de.uni freiburg.informatik.proglang</groupId><artifactId>myproject</artifactId><version>1.0−SNAPSHOT</version>

</project>

I Effektives POMmvn help:effective-pom

3http://books.sonatype.com/mvnref-book/reference/

pom-relationships-sect-pom.html#ex-super-pomRobert Jakob (Univ. Freiburg) Programmieren in Java JAVA 22 / 33

Page 25: Programmieren in Java - proglang.informatik.uni-freiburg.deproglang.informatik.uni-freiburg.de/.../slides/v12-classpath-jar-maven.… · $ java -jar calculator.jar Angabe von Classpath

Maven

Project Object Model

I Super POM3

Basis fur alle POM

I Einfachstes POM

<project><modelVersion>4.0.0</modelVersion><groupId>de.uni freiburg.informatik.proglang</groupId><artifactId>myproject</artifactId><version>1.0−SNAPSHOT</version>

</project>

I Effektives POMmvn help:effective-pom

3http://books.sonatype.com/mvnref-book/reference/

pom-relationships-sect-pom.html#ex-super-pomRobert Jakob (Univ. Freiburg) Programmieren in Java JAVA 22 / 33

Page 26: Programmieren in Java - proglang.informatik.uni-freiburg.deproglang.informatik.uni-freiburg.de/.../slides/v12-classpath-jar-maven.… · $ java -jar calculator.jar Angabe von Classpath

Maven

Standardvorgaben

Quelltext:

I src/main/java enthalt Java Quelltext

I src/main/resources enthalt Bilder, etc.

Tests:

I src/test/java enthalt Unit Tests

I src/test/resources enthalt Unit Tests

Ausgabe:

I target Ausgabeverzeichnis

I target/classes Klassenausgabe

I target/test-classes Testklassenausgabe

Robert Jakob (Univ. Freiburg) Programmieren in Java JAVA 23 / 33

Page 27: Programmieren in Java - proglang.informatik.uni-freiburg.deproglang.informatik.uni-freiburg.de/.../slides/v12-classpath-jar-maven.… · $ java -jar calculator.jar Angabe von Classpath

Maven

Standardvorgaben

Quelltext:

I src/main/java enthalt Java Quelltext

I src/main/resources enthalt Bilder, etc.

Tests:

I src/test/java enthalt Unit Tests

I src/test/resources enthalt Unit Tests

Ausgabe:

I target Ausgabeverzeichnis

I target/classes Klassenausgabe

I target/test-classes Testklassenausgabe

Robert Jakob (Univ. Freiburg) Programmieren in Java JAVA 23 / 33

Page 28: Programmieren in Java - proglang.informatik.uni-freiburg.deproglang.informatik.uni-freiburg.de/.../slides/v12-classpath-jar-maven.… · $ java -jar calculator.jar Angabe von Classpath

Maven

Standardvorgaben

Quelltext:

I src/main/java enthalt Java Quelltext

I src/main/resources enthalt Bilder, etc.

Tests:

I src/test/java enthalt Unit Tests

I src/test/resources enthalt Unit Tests

Ausgabe:

I target Ausgabeverzeichnis

I target/classes Klassenausgabe

I target/test-classes Testklassenausgabe

Robert Jakob (Univ. Freiburg) Programmieren in Java JAVA 23 / 33

Page 29: Programmieren in Java - proglang.informatik.uni-freiburg.deproglang.informatik.uni-freiburg.de/.../slides/v12-classpath-jar-maven.… · $ java -jar calculator.jar Angabe von Classpath

Maven

Java Version

I Standard Java Version ist 1.3

I Setzen der Version in pom.xml

<properties><maven.compiler.source>1.7</maven.compiler.source><maven.compiler.target>1.7</maven.compiler.target>

</properties>

Robert Jakob (Univ. Freiburg) Programmieren in Java JAVA 24 / 33

Page 30: Programmieren in Java - proglang.informatik.uni-freiburg.deproglang.informatik.uni-freiburg.de/.../slides/v12-classpath-jar-maven.… · $ java -jar calculator.jar Angabe von Classpath

Maven

Skelett erzeugen

I Einfaches “Hello World”-Skelett

I Interaktive Abfrage nach weiteren Feldern des POM

mvn archetype:generate \−DarchetypeGroupId=org.apache.maven.archetypes \−DarchetypeArtifactId=maven−archetype−quickstart

Robert Jakob (Univ. Freiburg) Programmieren in Java JAVA 25 / 33

Page 31: Programmieren in Java - proglang.informatik.uni-freiburg.deproglang.informatik.uni-freiburg.de/.../slides/v12-classpath-jar-maven.… · $ java -jar calculator.jar Angabe von Classpath

Maven

Lebenszyklus

I clean

Aufraumen von generierten Objekten4

I default

Erzeugen von Objekten

I site

Erzeugen von Berichten, Webseiten, . . .

4Sourcecode, Resourcen, . . .Robert Jakob (Univ. Freiburg) Programmieren in Java JAVA 26 / 33

Page 32: Programmieren in Java - proglang.informatik.uni-freiburg.deproglang.informatik.uni-freiburg.de/.../slides/v12-classpath-jar-maven.… · $ java -jar calculator.jar Angabe von Classpath

Maven

Lebenszyklus clean

I clean:pre-clean

Phase, welche von Plugins genutzt werden kann

I clean:clean

Eigentlicher Loschvorgang von ${basedir}/targetI clean:post-clean

Phase, welche von Plugins genutzt werden kann

$ mvn clean

Robert Jakob (Univ. Freiburg) Programmieren in Java JAVA 27 / 33

Page 33: Programmieren in Java - proglang.informatik.uni-freiburg.deproglang.informatik.uni-freiburg.de/.../slides/v12-classpath-jar-maven.… · $ java -jar calculator.jar Angabe von Classpath

Maven

Lebenszyklus default

I Manchmal auch “build” genannt

I Phasen (Auswahl):

I validateI generate-sourcesI generate-resourcesI compileI generate-test-sourcesI test-compile

I testI packageI integration-testI verifyI installI deploy

I Plugins werden in den entsprechenden Phasen aufgerufen(z.B. maven-compiler-plugin)

I Aufruf z.B. $ mvn test

Robert Jakob (Univ. Freiburg) Programmieren in Java JAVA 28 / 33

Page 34: Programmieren in Java - proglang.informatik.uni-freiburg.deproglang.informatik.uni-freiburg.de/.../slides/v12-classpath-jar-maven.… · $ java -jar calculator.jar Angabe von Classpath

Maven

Bindung der Phasen an Ziele

Phase Plugin-Ziel

process-resources resources:resources

compile compiler:compile

process-test-resources resources:testResources

test-compile compiler:testCompile

test surefire:test

package jar:jar

install install:install

deploy deploy:deploy

Robert Jakob (Univ. Freiburg) Programmieren in Java JAVA 29 / 33

Page 35: Programmieren in Java - proglang.informatik.uni-freiburg.deproglang.informatik.uni-freiburg.de/.../slides/v12-classpath-jar-maven.… · $ java -jar calculator.jar Angabe von Classpath

Maven

Lebenszyklus site

Erzeugen eines Reports bzw. einer Webseite$ mvn site

I Projektzusammenfassung

I Ansprechpartner

I Abhangigkeitsinformationen

I Javadoc

I Checkstyle

Robert Jakob (Univ. Freiburg) Programmieren in Java JAVA 30 / 33

Page 36: Programmieren in Java - proglang.informatik.uni-freiburg.deproglang.informatik.uni-freiburg.de/.../slides/v12-classpath-jar-maven.… · $ java -jar calculator.jar Angabe von Classpath

Maven

Dependencies

Abhangigkeiten zu anderen Bibliotheken und Projekten

I Dependencies in Maven:groupId:artifactId:jar:version (junit:junit:jar:4.11)

I Scope: compile, provided, runtime, test

I Zentrales Repository (http://search.maven.org)

Dependency in POM:

<dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope>

</dependency></dependencies>

Robert Jakob (Univ. Freiburg) Programmieren in Java JAVA 31 / 33

Page 37: Programmieren in Java - proglang.informatik.uni-freiburg.deproglang.informatik.uni-freiburg.de/.../slides/v12-classpath-jar-maven.… · $ java -jar calculator.jar Angabe von Classpath

Maven

Dependencies

Abhangigkeiten zu anderen Bibliotheken und Projekten

I Dependencies in Maven:groupId:artifactId:jar:version (junit:junit:jar:4.11)

I Scope: compile, provided, runtime, test

I Zentrales Repository (http://search.maven.org)

Dependency in POM:

<dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope>

</dependency></dependencies>

Robert Jakob (Univ. Freiburg) Programmieren in Java JAVA 31 / 33

Page 38: Programmieren in Java - proglang.informatik.uni-freiburg.deproglang.informatik.uni-freiburg.de/.../slides/v12-classpath-jar-maven.… · $ java -jar calculator.jar Angabe von Classpath

Maven

Dependencies (2)

I Bibliotheken konnen von weiteren Bibliotheken abhangen

I junit hangt von org.hamcrest:hamcrest-core:jar:1.3 ab

I Diese Abhangigkeiten werden automatisch erfulltI Konflikte moglich:

I Bibliothek A in Version 1.0 erforderlichI Bibliothek B in Version 2.0 erforderlich

I LosungsmoglichkeitI Angabe von Versionsbereichen: (3.8.1,4.11]I gezieltes Entfernen von Abhangigkeiten

Weitere Infos hier5.

5http://books.sonatype.com/mvnref-book/reference/

pom-relationships-sect-project-dependencies.htmlRobert Jakob (Univ. Freiburg) Programmieren in Java JAVA 32 / 33

Page 39: Programmieren in Java - proglang.informatik.uni-freiburg.deproglang.informatik.uni-freiburg.de/.../slides/v12-classpath-jar-maven.… · $ java -jar calculator.jar Angabe von Classpath

Maven

Referenzen

Weitere Infos

I Maven Homepagehttp://maven.apache.org

I Maven: The Definitive Guidehttp://books.sonatype.com/mvnref-book/reference/

Robert Jakob (Univ. Freiburg) Programmieren in Java JAVA 33 / 33