Praktikum Softwarearchitektur. Apache Maven. Klaus-Christian Saalfeld. 18. Juni FernUniversität in Hagen

Größe: px
Ab Seite anzeigen:

Download "Praktikum Softwarearchitektur. Apache Maven. Klaus-Christian Saalfeld. 18. Juni 2011. FernUniversität in Hagen"

Transkript

1 Praktikum Softwarearchitektur Apache Maven 18. Juni 2011 FernUniversität in Hagen

2 Inhaltsverzeichnis 1. Einführung in Maven 1 2. Grundlagen Erste Schritte mit Maven Struktur und Beschreibung eines Projektes Build Lifecycles Repositories und Dependency Management Plugins Exemplarische Anwendung Ein ANT Projekt als Fallbeispiel Vergleich zwischen ANT und Maven Portierung des ANT Projektes Erzeugung eines neuen Maven Projektes Hinzufügen der Java Quellen Portierung der Unit-Tests Hinzufügen der C Quellen Erzeugung eines.jar Archivs Architektur Plugin-Architektur Maven als Plugin-Framework Entwicklung eines Plugins Integration in den Maven Build Dependency Injection Plexus als Dependency Injection Framework Zusammenfassung und Ausblick Zusammenfassung Ausblick A. Anhang 27 A.1. build.xml A.2. Makefile A.3. JniCompilerPluginMojo.java A.4. pom.xml Literaturverzeichnis 36 i

3 1. Einführung in Maven Maven (deutsch: Experte) ist ein Build Management System für Java Projekte. Es kombiniert Funktionalität zum Programmbau mit zusätzlichen Aspekten zum Management von Abhängigkeiten. Maven wird von der Apache Software Foundation als Open Source Software entwickelt und unter der Apache Software License lizensiert. 2. Grundlagen 2.1. Erste Schritte mit Maven Maven kann von der Webseite der Apache Software Foundation heruntergeladen werden. Die jeweils aktuelle Version findet sich auf: Für alle Beispiele in dieser Ausarbeitung wird Version benutzt. Für die Nutzung von Maven ist die Binär-Distribution (apache-maven bin.zip) ausreichend. Zur Installation von Maven wird das heruntergeladene Archiv in ein beliebiges Verzeichnis entpackt. Damit Maven auf der Shell verfügbar ist, muss anschließend das Unterverzeichnis bin zum Suchpfad des Systems hinzugefügt werden. Dazu ist die Umgebungsvariable PATH entsprechend zu modifizieren. Da Maven selbst auf Java basiert muss ein Java SDK installiert sein. Ein reines Java Runtime (JRE) ist nicht ausreichend. Für die Beispiele in dieser Ausarbeitung wird das Java SDK Version 6 Update 25 verwendet. Dieses kann von der Webseite von Oracle bezogen werden: Für gängige Betriebssysteme werden Installer angeboten. Die Installation kann in ein beliebiges Verzeichnis erfolgen. Nach der Installation muss jedoch ggf. die Umgebungsvariable JAVA_HOME angepaßt werden. Diese muss auf das Verzeichnis der Java SDK Installation zeigen. Die korrekte Installation von Maven kann auf der Shell mit folgender Eingabe geprüft werden: mvn --help Bei einer erfolgreichen Installation führt dies zu der (gekürzten) Ausgabe: usage: mvn [options] [<goal(s)>] [<phase(s)>] Options: -am,--also-make... If project list is specified, also build projects required by the list 1

4 Über das Kommando mvn können Maven Projekte gebaut und verwaltet werden. Alle, für die praktische Nutzung von Maven notwendigen, Operationen lassen sich darüber ausführen. Eine typische Operation wäre beispielsweise das Compilieren aller.java Quellen eines Projektes und das anschließende Packen in einem.jar Archiv. Mit Maven wird das, für ein Projekt im aktuellen Verzeichnis, wie folgt erreicht: mvn package Maven benötigt Zugang zum Internet. Sofern ein Proxy verwendet wird, ist es notwendig die Konfiguration von Maven entsprechend anzupassen. Dies geschieht über einen Eintrag in der Datei settings.xml: <settings> <proxies> <proxy> <active>true</active> <protocol>http</protocol> <host>proxy.company.de</host> <port>8080</port> <username>myusername</username> <password>mypassword</password> </proxy> Diese befindet sich im Verzeichnis: ~/.m2/ Vergleiche [Tim O Brien et al., 2010, A.2.4, Proxies, Seite 248] Struktur und Beschreibung eines Projektes Vergleiche [Vincent Massol et al., 2008, Seite 28], [Tim O Brien et al., 2008, Kapitel 3.4, Seite 34f] und [Tim O Brien et al., 2010, Kapitel 3, The Project Object Model, Seite 17ff]. Ein Maven Projekt wird über das Project Object Model (kurz: POM) beschrieben. Die Beschreibung erfolgt für jedes Projekt im XML Format in der Datei pom.xml. Diese kann als Analogie zu build.xml (ANT) oder zum Makefile (Make) verstanden werden. Als Unterschied enthält sie aber, wie in Kapitel 3.2 noch beschrieben wird, keine Beschreibung der Build-Schritte, sondern eine rein deklarative Beschreibung des Projektes. Ein minimales Beispiel 1 einer pom.xml Datei kann wie folgt aussehen: 1 Vergleiche [Tim O Brien et al., 2010, Kapitel 3.2.2, The Simplest POM, Seite 22] 2

5 <project> <modelversion>4.0.0</modelversion> <groupid>com.company.project</groupid> <artifactid>samplejavaproject</artifactid> <version>1.0</version> </project> Als erste Information enthält sie die Coordinate des Projektes in Form der Tags groupid, artifactid und version. Die Coordinate dient als eindeutiger Bezeichner für das Projekt 2. Projekte müssen in Maven eindeutig identifizierbar sein, damit das Dependency Management und die Verwaltung der Maven Repositories funktioniert (siehe Kapitel 2.4). Die zweite Information in der gezeigten pom.xml Datei ist die Object Model Version, die durch den Tag modelversion gegeben ist [Vincent Massol et al., 2008, Seite 29]. Diese wählt indirekt die Super POM des Projektes. In Maven gibt es für POMs das Prinzip der Vererbung. Jedes POM erbt implizit die Informationen aus dieser Super POM. Dies funktioniert analog zur Vererbung in der objektorientierten Programmierung (OOP). Während jedoch in der OOP Felder und Methoden vererbt werden, werden in Maven POM Informationen in Gestalt von XML Daten weitervererbt. Durch die Vererbung wird das Konzept Convention Over Configuration von Maven unterstützt. Dieses wird in [Vincent Massol et al., 2008, Kapitel 1.2.1] beschrieben. Für Maven bedeutet es, dass für alle Einstellungen sinnvolle Standardwerte vorgegeben sind, die erst bei Notwendigkeit geändert werden müssen. Solche Einstellungen werden zum Teil durch Vererbung aus der Super POM, in die POM des jeweiligen Projektes, implizit übertragen. Neben dieser impliziten Vererbung aus der Super POM, können auch eigene POMs erstellt werden, von denen explizit geerbt werden kann. Ein Beispiel dazu findet sich in [Vincent Massol et al., 2008, Kapitel 3.3]. Das gezeigte Beispiel kann, obwohl es nur das Nötigste enthält, bereits genutzt werden, um ein Java Projekt mit Maven zu bauen. Dem Prinzip Convention Over Configuration folgend, ist die Struktur des Projektes dabei durch die Super POM vorgegeben. Die Java Quellen müssen, für einen erfolgreichen Bau, in das Unterverzeichnis src/main/java 3 kopiert werden. Für gewöhnlich ist es nicht notwendig und sinnvoll von dieser Vorgabe abzuweichen. Wie folgendes Beispiel zeigt, könnte es bei Bedarf aber getan werden: <project> <modelversion>4.0.0</modelversion> <groupid>com.company.project</groupid> <artifactid>samplejavaproject</artifactid> <version>1.0</version> 2 Der Sinn des Wortes Coordinate kann, wie in [Tim O Brien et al., 2008, Seite 45] dargestellt, verstanden werden: Analog zu einem Punkt in einem Koordinatensystem, kann jedes Projekt im Maven Space durch eine Coordinate eindeutig identifiziert werden. 3 Die aus dem Package resultierenden Verzeichnisstrukturen müssen hinzugefügt werden. 3

6 <build> <sourcedirectory>source/java</sourcedirectory> </build> </project> Das Beispiel überschreibt die Vorgaben aus der Super POM und legt source/java als neues Verzeichnis für Java Quellen fest. Das überschriebene Element wäre andernfalls durch die Super POM wie folgt definiert worden: <project> <build> <sourcedirectory>src/main/java</sourcedirectory> 2.3. Build Lifecycles Vergleiche [Tim O Brien et al., 2010, Kapitel 4, Seite 47ff], [Vincent Massol et al., 2008, Seite 30] und [Tim O Brien et al., 2008, Kapitel 3.5.2, Seite 38ff]. Ein wichtiges Konzept in Maven entspringt der Beobachtung, dass der Bau eines Projektes in immer gleichen Schritten mit einer wohldefinierten Reihenfolge erfolgt: Es müssen beispielsweise erst alle Quellen compiliert werden, bevor diese mit einem Unit-Test getestet werden können. Erst nachdem der Unit-Test erfolgreich war, kann das Projekt veröffentlicht oder anderen Nutzern zur Verfügung gestellt werden. Diese Aneinanderreihung von Schritten mit einer fest definierten Reihenfolge wird in Maven als Lifecycle bezeichnet 4. Maven ist nicht auf einen einzigen Lifecycle beschränkt - es integriert standardmäßig die Lifecycles default, clean und site. Die in einem Lifecycle abgearbeiteten Schritte werden Phasen genannt. Die Compilierung der Java Quellen findet beispielsweise im Lifecycle default in der Phase compile statt 5. Bei der praktischen Arbeit mit Maven wird üblicherweise die auszuführende Phase vorgegeben. Es werden dann auch alle Phasen ausgeführt, die im Lifecycle vor dieser Phase verankert sind. Um zum Beispiel die Phase compile und alle vorangehenden Phasen auszuführen, kann folgendes Kommando verwendet werden: mvn compile Die dabei ausgeführte Funktionalität ist nicht fest mit der Phase verbunden. Man kann sich vereinfacht vorstellen, dass Phasen völlig ohne Funktion sind und lediglich als Anknüpfungspunkte für Funktionalität dienen. Funktionalität wird in Form sog. Goals an die Phasen 4 Das Wort Cycle (deutsch: Zyklus) kann in diesem Zusammenhang zunächst verwirren, da der Bau eher als Sequenz anzusehen ist, die an einem bestimmten Punkt erfolgreich abgeschlossen und damit beendet ist. Ein Zyklus entsteht erst über die Lebenszeit des Projektes gesehen, da in dieser Zeit mit jedem Bau die Sequenz immer wieder von Neuem durchlaufen wird. 5 Eine vollständige Liste der Phasen ist in [Tim O Brien et al., 2010, Kapitel 4.1.2, Seite 50f] angegeben. Die Phasen des clean und site Lifecycles sind in [Tim O Brien et al., 2010, Kapitel 4.1.1, Seite 48ff] beschrieben. 4

7 gebunden. Die Goals werden dabei über Plugins zur Verfügung gestellt. Mehr dazu siehe Kapitel 2.5 und 4.1. Es ist auch möglich, einzelne Goals explizit auszuführen. Dazu wird das Plugin, wie in folgendem Schema gezeigt, mit seiner groupid, artifactid und version vorgegeben und das auszuführende Goal benannt: mvn groupid:artifactid:version:goal Vergleiche dazu [Tim O Brien et al., 2010, Kapitel , A Simple Java Mojo, Seite 186]. Um für ein Projekt Unit Tests auszuführen, ohne dabei den Lifecycle zu durchlaufen, kann beispielsweise folgender Aufruf verwendet werden: mvn org.apache.maven.plugins:maven-surefire-plugin:2.7.2:test 2.4. Repositories und Dependency Management Softwareprojekte nutzen häufig externe Bibliotheken und Frameworks. Da diese zum Bau des Softwareprojektes notwendig sind, werden sie auch Dependencies genannt. Für Java Projekte stehen diese Dependencies meist als.jar Packages zur Verfügung. Dependencies können in unterschiedlichen Versionen vorliegen und ihrerseits weitere Dependencies besitzen (sog. Transitive Dependencies [Tim O Brien et al., 2010, Kapitel 3.4.4, Transitive Dependencies, Seite 31]). Deshalb kann es in der Praxis schwierig sein, für ein Softwareprojekt ein korrektes Setup aller Dependencies zu erzeugen. Maven entlastet den Entwickler von dieser Arbeit, indem es das Dependency Management übernimmt. In der Praxis funktioniert das Dependency Management, indem in der Datei pom.xml die benötigten Dependencies des Projektes definiert werden. Download und Verwaltung dieser Dependencies (und ggf. weiterer transitiver Dependencies) übernimmt Maven. Maven lädt benötigte Dependencies automatisch aus einem Remote Repository herunter 6. Das voreingestellte Remote Repository ist: Die Dependencies werden in einem lokalen Repository abgelegt. Bei zukünftigen Builds werden die Dependencies aus dem lokalen Repository verwendet, sodaß sie nicht erneut aus dem Remote Depository bezogen werden müssen. Das lokale Repository befindet sich per Default im Home Verzeichnis des Benutzers unter: ~/.m2/repository Ein Beispiel für eine Dependency ist JUnit. Ein Projekt, das JUnit für seine Unit Tests benötigt, kann diese Dependency in der Datei pom.xml angeben: 6 Dazu ist eine Internetverbindung erforderlich. Gerade nach einer Erstinstallation wird Maven beim Bau eines Projektes eine große Anzahl an Dependencies aus dem Remote Repository herunterladen. 5

8 <project> <dependencies> <dependency> <groupid>junit</groupid> <artifactid>junit</artifactid> <version>3.8.1</version> <scope>test</scope> </dependency> Die Dependency muss dazu, wie in Kapitel 2.2 beschrieben, durch ihre Coordinate eindeutig identifiziert werden. Sofern JUnit noch nicht im lokalen Repository verfügbar ist, wird die gewünschte Version, vor dem Ausführen der Tests, zunächst aus dem Remote Repository übertragen. Bei der Ausführung der Tests wird der classpath durch Maven dann geeignet ergänzt:...:~/.m2/repository/junit/junit/3.8.1/junit jar Vertiefende Informationen zum Dependency Management mit Maven finden sich in [Tim O Brien et al., 2010, Kapitel 3.4, Project Dependencies, Seite 27] Plugins Vergleiche [Tim O Brien et al., 2010, Kapitel , What is a Plugin?]: Ein großer Teil der Funktionalität von Maven wird durch Plugins bereitgestellt. Eine Liste bereits verfügbarer Plugins findet sich unter: Plugins für Maven werden in Java geschrieben und typischerweise mit Maven selbst gebaut 7. Äußerlich unterscheidet sich ein Plugin nicht von einem normalen Maven Projekt: Fertig gebaut liegt es als.jar Package vor, das in ein Repository installiert und so von anderen Maven Nutzern verwendet werden kann. Zusätzlich zu den compilierten Klassen, enthält das Package lediglich einen Plugin Descriptor, der zusätzliche Informationen für die Nutzung des Plugins durch Maven liefert. Ein Plugin stellt ein oder mehrere Goals zur Verfügung. Ein solches Goal kann, wie in Kapitel 2.3 beschrieben, an eine Phase im Lifecycle gebunden werden. Wie in Kapitel 4.1 noch gezeigt wird, kann man sich ein Goal auch als Java Methode vorstellen, die von Maven aufgerufen wird. Jedes Goal wird in einer eigenen Klasse implementiert. Da ein Plugin mehrere Goals zur Verfügung stellen kann, kann es mehrere solcher Klassen enthalten. Eine Klasse, die ein Goal implementiert, wird auch Mojo genannt. Ein Mojo stellt somit genau ein Goal zur Verfügung. 7 Maven besitzt für diesen Zweck ein eigenes Plugin namens maven-plugin-plugin 6

9 3. Exemplarische Anwendung 3.1. Ein ANT Projekt als Fallbeispiel Um den praktischen Umgang mit Maven zu zeigen, soll exemplarisch ein ANT Projekt für Maven portiert werden. Ein gibt Literatur in welcher der Einstieg in Maven anhand eines Beispiel-Projektes beschrieben ist. Insbesondere [Vincent Massol et al., 2008, Kapitel 3, Seite 55ff] soll an dieser Stelle genannt werden. Ein Problem der Arbeiten zu diesem Thema ist jedoch, dass verständlicherweise Beispiele gewählt werden, die optimal für Maven geeignet sind. In der Praxis ist es jedoch häufig die eigentliche Herausforderung, die Grenzen einer Technologie zu kennen, um entscheiden zu können, ob sie für die Lösung eines Problems sinnvoll ist oder nicht. Eine derartige Abgrenzung wird in der Literatur selten vorgenommen, da primär die Vorteile einer neuen Technologie herausgestellt werden. In dieser Arbeit wurde deshalb ein reales Beispiel gewählt, das an den Randbereichen des sinnvollen Einsatzgebietes von Maven vermutet wird. Das exemplarisch gewählte Projekt ergänzt Java über JNI mit Funktionalität zum Lesen und Verändern der Microsoft Windows Registry. Es hat zwei Bestandteile: Ein in Java erstellter Teil und eine in C geschriebene DLL. Das Projekt wird bisher mit ANT gebaut. Zwar wird die DLL mit Make erzeugt (siehe Anhang A.2), die entsprechenden Aufrufe werden allerdings vom ANT Skript (siehe Anhang A.1) delegiert. Insgesamt wird der Bau des Projektes also über ANT gesteuert Vergleich zwischen ANT und Maven Ein wichtiger Aspekt von Maven ist der Programmbau. Da Maven aber auch weitere Funktionalitäten beinhaltet, ist es kein reines Tool zum Programmbau wie ANT (oder das klassische Make). Für einen Vergleich wird hier deshalb zunächst nur der Aspekt des Programmbaus betrachtet. Um die Unterschiede zu reinen Build-Tools zu verdeutlichen, wird auch kurz das klassische Make betrachtet. Beim Programmbau unterscheidet sich Maven von ANT und Make: In ANT und Make werden Ziele und Abhängigkeiten spezifiziert. Für jedes Ziel werden dann die notwendigen Aktionen beschrieben um es zu erreichen. Als eine grobe Unterscheidung zwischen ANT und Make kann festgestellt werden, dass in ANT die Aktionen (hier Tasks genannt) abstrakter sind als in Make. Dies kann an einem kleinen Beispiel verdeutlicht werden. Ein Ziel beim Bau eines Java Projektes besteht beispielsweise in der Erzeugung von.class Dateien aus den.java Quelldateien, welche in diesem Fall die Abhängigkeiten darstellen. Eine Lösungsmöglichkeit in Make wäre die folgende:.phony: all compile 7

10 all:.depend compile.depend: echo "compile: \\" >.depend find. -name "*.java" -type f \ sed -n "s%^\(.*\)\.java.*%\1.class \\\\\\%p" >>.depend -include.depend %.class: %.java javac $< Das Äquivalent in ANT ist im Folgenden dargestellt: <project name="samplejavaproject" default="compile"> <target name="compile"> <javac srcdir="." includeantruntime="false" /> </target> </project> Beide Lösungen haben offensichtliche Unterschiede 8. Als Gemeinsamkeit kann für beide aber festgestellt werden, dass die notwendigen Schritte für einen erfolgreichen Bau des Projektes beschrieben werden. Im Gegensatz dazu, wird in Maven das zu bauende Projekt beschrieben. Der Weg, wie ein Projekt zu bauen ist, muss nicht angegeben werden. Es gibt demnach auch keine Ziele und Abhängigkeiten. Die notwendigen Schritte für den erfolgreichen Bau werden von Maven für das Projekt passend gewählt und ausgeführt. Ein korrespondierendes Maven Projekt 9 (genauer: die Datei pom.xml) sähe wie folgt aus: <project> <modelversion>4.0.0</modelversion> <groupid>com.company.project</groupid> <artifactid>samplejavaproject</artifactid> <version>1.0</version> </project> Man sieht, dass hier weder einzelne Build-Schritte noch die, dem Projekt zugeordneten, Quelldateien definiert sind. Damit dies funktionieren kann, muss man sich allerdings an die Konventionen von Maven halten (siehe Kapitel 2.2). 8 Das Beispiel zeigt, dass ANT in Bezug auf die Verständlichkeit Vorteile bringt. Auch Plattformunabhängigkeit ist ein weiterer wichtiger Vorteil von ANT - das Makefile dieses Beispiels funktioniert nur auf unixoiden Systemen. Flexibilität ist hingegen der große Vorteil von Make - beispielsweise steuert es die Übersetzung der L A TEX Quellen dieser Arbeit. 9 Vergleiche [Tim O Brien et al., 2010, Kapitel 3.2.2, Seite 22] 8

11 3.3. Portierung des ANT Projektes Erzeugung eines neuen Maven Projektes Erster Schritt bei der Portierung ist die Erzeugung eines neuen Maven Projektes. Dies geschieht wie folgt: mvn archetype:create -DgroupId=com.sse.jregedit \ -DartifactId=JRegEdit -Dversion=1.0 Maven erzeugt dadurch ein neues Projekt, das einen minimalen Satz an Beispiel-Dateien enthält. Hierbei von Interesse ist lediglich die Datei pom.xml und die erzeugten Verzeichnisse - die restlichen.java Dateien sind Beispiele und können gelöscht werden. Es ist nicht zwingend ein neues Projekt auf diese Weise zu erzeugen. Es wäre ebenso möglich gewesen, die notwendigen Dateien und Verzeichnisse von Hand zu erstellen. Die Datei- und Verzeichnisstruktur sollte am Ende lediglich wie folgt aussehen: JRegEdit / pom.xml / src / main / java / com / sse / jregedit / test / java / com / sse / jregedit Der Inhalt der erzeugten pom.xml sieht wie folgt aus: <project xmlns="http://maven.apache.org/pom/4.0.0" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://maven.apache.org/pom/4.0.0 \ <modelversion>4.0.0</modelversion> <groupid>com.sse.jregedit</groupid> <artifactid>jregedit</artifactid> <version>1.0</version> <packaging>jar</packaging> <name>jregedit</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceencoding>utf-8</project.build.sourceencoding> </properties> <dependencies> <dependency> <groupid>junit</groupid> <artifactid>junit</artifactid> <version>3.8.1</version> <scope>test</scope> 9

12 </dependency> </dependencies> </project> Hinzufügen der Java Quellen Als zweiter Schritt werden die Java Quellen dem neuen Maven Projekt hinzugefügt. Die Java Quellen (ohne die Unit-Test Klassen) werden in die Verzeichnisstruktur unterhalb von src eingefügt. Dies resultiert in folgender Projektstruktur 10 : JRegEdit / pom.xml / src / main / java / [...] / JRegEdit.java / JRegEditException.java / JRegEditKeyChangeListener.java / JRegEditListenHandle.java / JRegEditListenProperties.java / test / java / [...] / Die Quellen können nun mit Maven wie folgt compiliert werden: mvn compile Die compilierten.class Dateien werden in einer neuen Verzeichnisstruktur gespeichert: JRegEdit / target / classes / [...] / JRegEdit.class / JRegEditException.class / JRegEditKeyChangeListener.class / JRegEditListenHandle.class / JRegEditListenProperties.class Das Löschen der erzeugten Dateien geschieht mit Maven wie folgt: mvn clean Portierung der Unit-Tests Ein nächster Schritt bei der Portierung ist das Hinzufügen der Klassen für die Unit-Tests. Maven unterstützt Unit-Tests mit JUnit als Standard 11. Es macht Sinn, sich dieser Konvention anzupassen und den proprietären Unit-Test für JUnit zu portieren. Dies ermöglicht es jedem Entwickler (ganz im Sinne von Maven) sich schnell in das Projekt einzuarbeiten, da vorhandenes Wissen aus anderen Maven Projekten (wie z.b. über JUnit) wiederverwendet werden kann. Die Einarbeitung in (unnötige) Eigenheiten des Projektes wie ein proprietärer 10 Die aus dem Package Namen com.sse.jregedit resultierenden Verzeichnisse (com/sse/jregedit) werden zur besseren Übersichtlichkeit hier und in den folgenden Ausführungen durch [...] ersetzt. 11 In Maven wird diese Funktionalität über das Surefire Plugin maven-surefire-plugin realisiert. 10

13 Unit-Test entfällt in diesem Fall. Der portierte Unit-Test wird in Form der Klasse JRegEditTest.java in das Projekt eingebunden. Die Unit-Test Quellen werden nicht unterhalb von src, sondern unterhalb des Verzeichnisses test eingefügt: JRegEdit / test / java / [...] / JRegEditTest.java Um die Tests auszuführen wird folgendes Kommando verwendet: mvn test Auf das Beispiel angewendet, führt das Kommando zur folgenden Ausgabe (gekürzt und aufbereitet): T E S T S Running com.sse.jregedit.jregedittest Tests run: 18, Failures: 0, Errors: 18, Skipped: 0, Time elapsed: sec <<< FAILURE! Results : Tests in error: testregcreatekey(com.sse.jregedit.jregedittest): no jregedit in java.library.path testregdeletekey(com.sse.jregedit.jregedittest): Could not initialize class com.sse.jregedit.jregedit testregexistskey(com.sse.jregedit.jregedittest): Could not initialize class com.sse.jregedit.jregedit... Tests run: 18, Failures: 0, Errors: 18, Skipped: 0 [INFO] [INFO] BUILD FAILURE [INFO] Wie hier zu sehen ist, treten beim Test Fehler auf. Der Grund für diese Fehler liegt in der fehlenden DLL die noch nicht dem neuen Maven Projekt hinzugefügt wurde. Wird diese testweise in das aktuelle Verzeichnis kopiert 12, werden die Unit-Tests bestanden: Es genügt diese in ein Verzeichnis zu legen, welches das System nach DLLs durchsucht. 11

14 T E S T S Running com.sse.jregedit.jregedittest Tests run: 18, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: sec Results : Tests run: 18, Failures: 0, Errors: 0, Skipped: 0 [INFO] [INFO] BUILD SUCCESS [INFO] Sofern die DLL noch nicht erzeugt vorliegt, kann die Phase test auch explizit übersprungen werden. Dies zeigt folgendes Beispiel, das ein Package aus den compilierten Klassen erzeugt, ohne diese zuvor zu testen: mvn package -Dmaven.test.skip=true Als Reaktion auf mvn test werden die Java Quellen des Unit-Tests und (soforn notwendig) alle Java Quellen des Projektes compiliert 13. Die compilierten Unit-Test Klassen werden in einem neuen Verzeichnis der Projektstruktur abgelegt: JRegEdit / target / test-classes / [...] / JRegEditTest.class / JRegEditTest$1.class / JRegEditTest$2.class / JRegEditTest$3.class Mit der Ausführung der Unit-Tests werden weitere Verzeichnisse erzeugt. In diesen werden unter anderem die Ergebnisse der Tests gespeichert Hinzufügen der C Quellen Nachdem der Bau der Java Quellen funktioniert, ist ein nächster Schritt, die Erzeugung der DLL in den Build-Prozess zu integrieren. Zunächst werden dazu die C Quellen dem Projekt hinzugefügt. Da Maven keine Vorgabe besitzt, wo diese abzulegen sind, muss das Verzeichnis selbst gewählt werden. Die C Quellen werden wie folgt in die Projektstruktur eingefügt 14 : JRegEdit / src / main / native / windows / app / jni / reg / utils / win32 13 Dies resultiert aus der Tatsache, dass die Phase test im Default Lifecycle nach der Phase compile und test-compile verankert ist 14 Die Namen der.c und.cpp Dateien werden, der Übersichtlichkeit wegen, nicht dargestellt 12

15 Wie sich mit dem Kommando mvn compile prüfen läßt, hatte das Hinzufügen der Dateien noch keinen Einfluss auf den Build. Das Ziel wäre das gleiche Verhalten zu erhalten wie bei Verwendung des ANT Skriptes (siehe Anhang A.1): Ein Bauen der Java Quellen über das Target all führt hier auch zum Compilieren der C Quellen. Alle Bauprodukte werden gemeinsam durch das Target clean wieder entfernt. Um ein solches Verhalten mit Maven zu erzielen, müssen neue Goals an die Phasen im Lifecycle gebunden werden (siehe Kapitel 2.3). Dies wird durch Modifikation der Datei pom.xml erreicht. Das Verfahren dazu wird beispielhaft in [Vincent Massol et al., 2008, Kapitel 3.7, Seite 68f] beschrieben und liegt auch der hier vorgestellten Lösung zu Grunde. Um das gleiche Verhalten wie bei Verwendung des ANT Skriptes zu erhalten, kann ein zusätzliches Goal an die Phase compile im Default Lifecycle gebunden werden, das die Compilierung der C Quellen übernimmt. Ein an clean gebundenes Goal, kann die, aus den C Quellen erzeugten, Bauprodukte wieder entfernen. Die einfachste Lösung dafür scheint hier die Verwendung des Plugins exec-maven-plugin zu sein, welches das Goal exec bereitstellt. Dieses erlaubt die Ausführung beliebiger Anwendungen 15. Dadurch ist es möglich, die genannten Aufgaben wie bisher an Make zu delegieren. Es wird dazu der folgende Ausschnitt unterhalb von project! build! plugins in die Datei pom.xml eingefügt: <plugin> <groupid>org.codehaus.mojo</groupid> <artifactid>exec-maven-plugin</artifactid> <version>1.2</version> <executions> <execution> <id>native-compile</id> <phase>compile</phase> <goals> <goal>exec</goal> </goals> <configuration> <executable>make</executable> <commandlineargs>-c./src/main/native/windows all</commandlineargs> </configuration> </execution> <execution> <id>native-clean</id> <phase>clean</phase> <goals> <goal>exec</goal> </goals> <configuration> 15 Vergleiche 13

16 <executable>make</executable> <commandlineargs>-c./src/main/native/windows clean</commandlineargs> </configuration> </execution> </executions> </plugin> Das Kommando mvn compile führt nun zur Ausgabe (gekürzt und aufbereitet):... [INFO] --- maven-compiler-plugin:2.3.2:compile JRegEdit --- [INFO] Compiling 5 source files to D:\JRegEdit\target\classes [INFO] [INFO] --- exec-maven-plugin:1.2:exec JRegEdit --- make.exe: Entering directory D:/JRegEdit/src/main/native/windows... g++ -s -shared -static-libgcc -static -mwindows -o jregedit.dll utils/utils.o win32/win32_utils.o app/reg_key_copy.o app/reg_key_create.o app/reg_key_delete.o app/reg_key_enum.o app/reg_key_exists.o app/reg_key_flush.o app/reg_key_listen.o app/reg_key_map.o app/reg_value_create.o app/reg_value_delete.o app/reg_value_enum.o app/reg_value_exists.o app/reg_value_get.o jni/jni_exception.o jni/jni_object.o reg/reg_utils.o jregedit.o jregedit.res jregedit.def -O3 -Wall -Wextra make.exe: Leaving directory D:/JRegEdit/src/main/native/windows [INFO] [INFO] BUILD SUCCESS [INFO] Ein anschließendes mvn clean führt zur Ausgabe (gekürzt und aufbereitet):... [INFO] --- maven-clean-plugin:2.4.1:clean JRegEdit --- [INFO] Deleting D:\JRegEdit\target [INFO] [INFO] --- exec-maven-plugin:1.2:exec JRegEdit --- make.exe: Entering directory D:/JRegEdit/src/main/native/windows... rm -f utils/utils.o win32/win32_utils.o app/reg_key_copy.o app/reg_key_create.o app/reg_key_delete.o app/reg_key_enum.o app/reg_key_exists.o app/reg_key_flush.o app/reg_key_listen.o app/reg_key_map.o app/reg_value_create.o app/reg_value_delete.o app/reg_value_enum.o app/reg_value_exists.o app/reg_value_get.o jni/jni_exception.o jni/jni_object.o reg/reg_utils.o jregedit.o make.exe: Leaving directory D:/JRegEdit/src/main/native/windows 14

17 [INFO] [INFO] BUILD SUCCESS [INFO] Bei einem Blick in das ANT Skript (siehe Anhang A.1) fällt auf, dass die Erzeugung der JNI Header Datei mit Hilfe von javah und die Kopieraktionen noch nicht in pom.xml integriert wurden. Dies wäre ebenfalls nach der hier vorgestellten Methode möglich. Man kann aber darüber streiten, ob die hier vorgestellte Lösung dem Grundgedanken von Maven entspricht, da mit dem exec-maven-plugin eigentlich wieder Build-Schritte beschrieben werden - nur wesentlich umständlicher. Ein JNI Plugin welches den Bau der DLL aus C Quellen übernimmt wäre eine sauberere Lösung. In Kapitel 4.1 wird ein solcher Ansatz vorgestellt Erzeugung eines.jar Archivs Die bei der Compilierung erzeugten.class Dateien werden über mvn package in einem.jar Archiv gepackt. Als zusätzliche Aufgabe muss diesem die DLL hinzugefügt werden. Alle Versuche, dies direkt durch Konfiguration von maven-jar-plugin zu erreichen, blieben ohne Erfolg 16. In diesem Fall könnte mit Assemblies gearbeitet werden. Mit Assemblies können benutzerdefinierte Zusammenstellungen von Dateien als Package erzeugt werden. Dies funktionierte im Versuch gut, führte allerdings zu weiterer Arbeit, da das erzeugte Package nicht automatisch mit in das Repository installiert wird. Der Versuch wurde an diesem Punkt deshalb beendet. Zur Lösung dieses Problems wird in Kapitel 4.1 ein Plugin entwickelt und beschrieben. 4. Architektur 4.1. Plugin-Architektur Maven als Plugin-Framework Ein großer Teil der Funktionalität wird in Maven durch Plugins bereitgestellt. Man kann Maven deshalb auch als Plugin-Framework ansehen. Um diese Architektur zu verstehen, soll exemplarisch ein neues Plugin für Maven erstellt werden. An diesem Beispiel wird gezeigt, wie und mit welchen Techniken das Plugin in Maven integriert wird. 16 Das Einbinden von Dateien funktioniert offenbar nur unterhalb des classesdirectory. Dieses kann zwar umkonfiguriert werden, dadurch ändern sich allerdings auch die Pfade im.jar Archiv. 15

18 Entwicklung eines Plugins Das exemplarisch entwickelte Plugin (siehe Anhang A.3) knüpft an den Erkenntnissen aus Kapitel an. Dort wurde die Portierung eines ANT basierten JNI Projektes beschrieben. Es wurde gezeigt, wie ein bestehendes Makefile, das den Bau der C Quellen übernimmt, in den Maven Build integriert werden kann. Allein mit den verfügbaren Bordmitteln waren aber nicht alle Probleme in akzeptabler Zeit lösbar. Auch wurde angemerkt, dass die vorgestellte Lösung im Sinne von Maven nicht optimal ist. An dieser Stelle wird deshalb zur Lösung der Probleme ein JNI Plugin entwickelt, dass den Bau des nativen Teils des JNI Projektes übernimmt. Ein neues Plugin wird über den bereits bekannten Archetype Mechanismus wie folgt erzeugt: mvn archetype:create -DgroupId=com.sse.maven.jni \ -DartifactId=maven-jni-compiler-plugin \ -DarchetypeArtifactId=maven-archetype-mojo Die entwickelte Plugin-Klasse JniCompilerPluginMojo.java (siehe Anhang A.3) kann anschließend in die erzeugte Verzeichnisstruktur \maven-jni-compiler-plugin\src\main\java\com\sse\maven\jni eingefügt werden. Alle Beispiel-Klassen können aus dem Projekt entfernt werden. Das Plugin kann anschließend mit mvn compile compiliert werden. Die Bestandteile eines Maven Plugins werden exemplarisch anhand der entwickelten Plugin- Klasse JniCompilerPluginMojo.java vorgestellt. Diese kann auf folgendes Grundgerüst reduziert werden: package com.sse.maven.jni; import org.apache.maven.plugin.abstractmojo; import org.apache.maven.plugin.mojoexecutionexception; /** compile compile */ public class JniCompilerPluginMojo extends AbstractMojo public void execute() throws MojoExecutionException //... 16

19 Für jedes Goal enthält ein Plugin eine Klasse, die direkt oder indirekt das Interface org.apache.maven.plugin.mojo implementiert. Hier geschieht das durch Ableitung von AbstractMojo. Die von einem Goal bereitgestellte Funktionalität muss über die Methode execute() implementiert werden. Diese Methode wird von Maven aufgerufen, um ein Goal auszuführen. Nicht immer kann ein Goal erfolgreich abgeschlossen werden: Beispielsweise kann ein Syntaxfehler den erfolgreichen Bau der Java Quellen mit dem maven-compiler-plugin verhindern. In solchen Fällen kann die Methode eine MojoExecutionException werfen. Der Maven Build wird dann mit einem Fehler abgebrochen: [ERROR] Failed to execute goal org.apache.maven.plugins: maven-compiler-plugin:2.3.2:compile (default-compile) on project... Die Klasse AbstractMojo stellt auch ein Log bereit, mit dem eigene Ausgaben erzeugt werden können. Vergleiche [Tim O Brien et al., 2010, Kapitel , Mojo Class Annotations]: Bei der Klasse fallen Annotationen auf, die nicht mit Javadoc in Zusammenhang stehen. Aus diesen wird automatisch beim Bau des Plugins der Plugin Descriptor erzeugt, welcher als XML Datei in das.jar Package eingebunden wird. Über die wird der Name des Goals festgelegt, welches die Klasse bereitstellt. Die ist optional und bezeichnet die Phase, an welche das Goal standardmäßig gebunden ist, falls der Nutzer des Plugins keine explizite Bindung vorgibt. Der Plugin Descriptor findet sich im Package des Plugins unter: /META-INF/maven/plugin.xml Über die Annotationen werden dem Plugin Descriptor folgende Informationen hinzugefügt: <plugin> <mojos> <mojo> <goal>compile</goal> <phase>compile</phase> </mojo> Durch die Verwendung von Annotationen muss der Plugin Descriptor nicht manuell erstellt oder angepaßt werden. Grundsätzlich wäre dies aber auch möglich. In vielen Fällen ist es notwendig, im Plugin auf Informationen über den Build zuzugreifen. Quelle dieser Informationen ist unter anderem die Datei pom.xml eines Projektes 17. Der Zugriff auf diese Daten wird ebenfalls durch Annotationen und damit über den Plugin Descriptor ermöglicht. Der folgende Ausschnitt zeigt beispielhaft den Zugriff auf die artifactid und groupid eines Projektes: 17 Genauer: Die aus Super POM und ggf. anderen POMs gebildete Effective POM. Diese kann man sich durch das Kommando mvn help:effective-pom anzeigen lassen. 17

20 public class JniCompilerPluginMojo extends AbstractMojo /** expression="$project.artifactid" */ private String artifactid; /** expression="$project.groupid" */ private String groupid; //... Wird das Goal in einem Projekt verwendet, stehen die artifactid und groupid des Projektes, dem instanziierten Objekt, in den hier gezeigten, gleichnamigen, privaten Feldern zur Verfügung. Im Plugin Descriptor wurden dazu folgende Einträge ergänzt: <plugin> <mojos> <mojo> <parameters> <parameter> <name>artifactid</name> <type>java.lang.string</type> <required>true</required> <editable>true</editable> <description /> </parameter> <parameter> <name>groupid</name> <type>java.lang.string</type> <required>true</required> <editable>true</editable> <description /> </parameter> In Kapitel 4.2 wird diese Umsetzung noch einmal genauer betrachtet Integration in den Maven Build Das vorgestellte Plugin kann mit folgendem Kommando compiliert und in das lokale Repository installiert werden: mvn install 18

21 Nachdem das Plugin im lokalen Repository abgelegt wurde, kann es im JNI Projekt verwendet werden. Dazu wird die pom.xml des JNI Projektes (siehe Anhang A.4) wie folgt ergänzt: <project> <build> <plugins> <plugin> <groupid>com.sse.maven.jni</groupid> <artifactid>maven-jni-compiler-plugin</artifactid> <version>1.0</version> <executions> <!-- this binds the JNI compiler plugin to the compile phase --> <execution> <phase>compile</phase> <goals> <goal>compile</goal> </goals> </execution> Dies bindet das vom Plugin bereitgestellte Goal compile an die compile Phase im Default Lifecycle. Es wird nun beim Compilieren des JNI Projektes automatisch in der Phase compile ausgeführt. Das Bauen des JNI Projektes mit mvn compile führt dann zu folgender Ausgabe (gekürzt und optisch aufgearbeitet):... [INFO] --- maven-jni-compiler-plugin:1.0:compile JRegEdit --- [INFO] javah -jni -classpath "D:\JRegEdit_Maven\target\classes" -o "D:\JRegEdit_Maven\target\native\windows\JRegEdit_jni.h" com.sse.jregedit.jregedit... [INFO] g++ -c "D:\JRegEdit_Maven\src\main\native\windows\app\reg_key_create.cpp" -o "D:\JRegEdit_Maven\target\native\windows\app\reg_key_create.o" -I"D:\JRegEdit_Maven\src\main\native\windows" -I"D:\Programme\Java\jdk1.6.0_24\include" -I"D:\Programme\Java\jdk1.6.0_24\include\win32" -I"D:\JRegEdit_Maven\target\native\windows" -O3 -Wall -Wextra... [INFO] windres -i "D:\JRegEdit_Maven\src\main\native\windows\jregedit.rc" --input-format=rc -o "D:\JRegEdit_Maven\target\native\windows\jregedit.res" -O coff... 19

22 [INFO] g++ -s -shared -static-libgcc -static -o "D:\JRegEdit_Maven\target\native\windows\JRegEdit.dll" "D:\JRegEdit_Maven\target\native\windows\app\reg_key_copy.o" "D:\JRegEdit_Maven\target\native\windows\app\reg_key_create.o" "D:\JRegEdit_Maven\target\native\windows\app\reg_key_delete.o" "D:\JRegEdit_Maven\target\native\windows\app\reg_key_enum.o" "D:\JRegEdit_Maven\target\native\windows\app\reg_key_exists.o" "D:\JRegEdit_Maven\target\native\windows\app\reg_key_flush.o" "D:\JRegEdit_Maven\target\native\windows\app\reg_key_listen.o" "D:\JRegEdit_Maven\target\native\windows\app\reg_key_map.o" "D:\JRegEdit_Maven\target\native\windows\app\reg_value_create.o" "D:\JRegEdit_Maven\target\native\windows\app\reg_value_delete.o" "D:\JRegEdit_Maven\target\native\windows\app\reg_value_enum.o" "D:\JRegEdit_Maven\target\native\windows\app\reg_value_exists.o" "D:\JRegEdit_Maven\target\native\windows\app\reg_value_get.o" "D:\JRegEdit_Maven\target\native\windows\jni\jni_exception.o" "D:\JRegEdit_Maven\target\native\windows\jni\jni_object.o" "D:\JRegEdit_Maven\target\native\windows\reg\reg_utils.o" "D:\JRegEdit_Maven\target\native\windows\jregedit.o" "D:\JRegEdit_Maven\target\native\windows\utils\utils.o" "D:\JRegEdit_Maven\target\native\windows\win32\win32_utils.o" "D:\JRegEdit_Maven\target\native\windows\jregedit.res" "D:\JRegEdit_Maven\src\main\native\windows\JRegEdit.def" -O3 -Wall -Wextra [INFO] [INFO] BUILD SUCCESS [INFO] Es verbleibt ein offener Punkt aus Kapitel 3.3.5: Das Hinzufügen der DLL in das.jar Archiv. Das entwickelte Plugin bietet dafür eine Lösung. Per Konfiguration des Parameters nativeoutputartifactplacements in der Datei pom.xml (siehe Anhang A.4) kann die erzeugte DLL an beliebige Orte im Projekt und im System kopiert werden: <plugin> <groupid>com.sse.maven.jni</groupid> <artifactid>maven-jni-compiler-plugin</artifactid> <configuration> <nativeoutputartifactplacements> <nativeoutputartifactplacement> $basedir </nativeoutputartifactplacement> <nativeoutputartifactplacement> $project.build.outputdirectory/com/sse/jregedit/resources </nativeoutputartifactplacement> </nativeoutputartifactplacements> </configuration> </plugin> 20

23 Die DLL wird darüber in die von maven-jar-plugin genutzten Verzeichnisse kopiert, sodaß sie automatisch in das Package eingebunden wird. Durch das Kopieren der DLL in ein Verzeichnis, aus dem das System Libraries lädt (hier: $basedir), kann auch das Problem des Testens gelöst werden (siehe Kapitel 3.3.3). Für den Test wird dadurch immer die aktuelle Version der DLL gefunden und genutzt. Ein Problem besitzt das Plugin dann allerdings doch: Der Bau der C Quellen erfolgt, im Vergleich zum originalen Projekt aus Kapitel 3, nicht mehr inkrementell. Eine solche Lösung wäre deutlich aufwändiger Dependency Injection In Kapitel 4.1 wurde ein Plugin für Maven entwickelt und vorgestellt. An diesem Beispiel war zu sehen, dass per XML in der Datei pom.xml definierte Inhalte über private Felder des Plugins verfügbar waren. Ein solches Beispiel ist das Feld nativeincludepaths: public class JniCompilerPluginMojo extends AbstractMojo /** */ private File[] nativeincludepaths; //... Der Inhalt dieses Feldes kann per XML festgelegt werden. Dies geschieht wie folgt: <project> <build> <plugins> <plugin> <configuration> <!-- puts two path names as File objects in nativeincludepaths --> <nativeincludepaths> <nativeincludepath> $env.java_home/include </nativeincludepath> <nativeincludepath> $env.java_home/include/win32 </nativeincludepath> </nativeincludepaths> Aus Sicht des umgebenden Objektes, ist das Feld, ohne weiteres Zutun, sofort korrekt initialisiert. Das Feld ist private und über keine öffentlichen Methoden nach außen verfügbar. 21

24 Es ist deshalb zunächst offensichtlich, dass es eines speziellen Sprachmittels (Reflection) bedarf, um das Feld wie gesehen zu initialisieren. Es stellt sich darüber hinaus allerdings die Frage, welchen Sinn ein solches Vorgehen hat. So wäre es durchaus auch denkbar, dass das Feld vom Objekt selbst initialisiert wird und der Initialwert beispielsweise aus einer externen Factory bezogen wird. Mit der Antwort auf diese Frage beschäftigt sich dieses Kapitel. Zunächst jedoch eine Definition: Das gezeigte Prinzip nennt sich Dependency Injection (DI) und die dahinter stehende allgemeine Idee Inversion of Control (IoC). Dependency Injection 18 bezeichnet also das Prinzip, dass ein Objekt benötigte Objekte nicht selbst erzeugt, sondern dass diese extern erzeugt und von außen eingefügt werden. Da dabei die Kontrolle über die Erzeugung aus dem Objekt selbst nach außen verlagert wird, spricht man hierbei von Inversion of Control. Frameworks, die dies umsetzen, werden auch Inversion of Control Container genannt. Mit Dependency Injection begegnet man Problemen, die sich insbesondere bei großen Softwaresystemen ergeben können: Betrachtet man eine objektorientiere Software zur Laufzeit, so stellt sich diese als ein Netz miteinander verbundener Objekte dar. Es stellt sich die Frage, wer die Dependencies für diese Objekte erzeugt. Als klassische Möglichkeit erzeugt jedes Objekt seine Dependencies selbst. Dies ist oft zu unflexibel. Man kann dann mit Factories arbeiten. Insbesondere beim Testen großer Systeme können hierbei aber auch die Grenzen erreicht sein. In solchen Fällen kann man auf Dependency Injection zurückgreifen, das hier Vorteile bringt: Zur Realisierung von Dependency Injection werden häufig Frameworks verwendet, bei welchen die Abhängigkeiten in XML Dateien abgelegt sind. Für Testzwecke können darüber Abhängigkeiten leicht und ohne Änderungen im Quellcode getauscht werden. Beispielsweise kann ein via TCP/IP kommunizierendes Objekt gegen ein Test-Objekt (Mock-Objekt) getauscht werden, das gezielt Fehlerfälle simuliert. Auch können beliebige Zusammenstellungen von Objekten leichter realisiert werden. 19 Dependency Injection kann auf verschiedene Arten umgesetzt werden. Diese unterscheiden sich darin, wie Abhängigkeiten in ein Objekt eingefügt werden. Unter anderem existieren dazu folgenden Möglichkeiten: Setter Injection Abhängigkeiten werden über eine öffentliche Setter Methode in ein Feld übernommen. 18 Zur Erklärung dieser Wortschöpfung: Ein Objekt das in einem Feld eine Referenz auf ein anderes Objekt besitzt, ist von dem referenzierten Objekt abhängig: Ohne das referenzierte andere Objekt könnte das Objekt selbst seine Arbeit typischerweise nicht verrichten. Man spricht deshalb in diesem Fall von einer Dependency (deutsch: Abhängigkeit). Wird diese nicht vom Objekt selbst erzeugt sondern von außen eingeschleußt, liegt eine Injection vor. 19 Dependency Injection bringt aber nicht nur Vorteile: Da die Identität von abhängigen Objekten im Quellcode nicht mehr erkennbar ist, kann das Verständnis der Zusammenhänge erschwert werden. Auch sind Kenntnisse über das Dependency Injection Framework notwendig. Probleme ergeben sich auch für Analyse-Tools, die auf statischer Ebene arbeiten sowie für bestimmte Funktionen in Entwicklungsumgebungen. 22

25 Constructor Injection Abhängigkeiten werden dem Konstruktor als Parameter bei der Objekt Instanziierung übergeben. Field Injection Abhängigkeiten werden über Reflection direkt in ein Feld geschrieben. Eine weiterführende Einführung in Dependency Injection findet sich in Fowler [2004]. Ein kurzer Vergleich verschiedener Dependency Injection Frameworks kann in Sanitz [2005] gefunden werden Plexus als Dependency Injection Framework In Kapitel 4.2 wird Dependency Injection und seine Verwendung in Maven vorgestellt. Maven nutzt ein Framework namens Plexus um Dependency Injection zu realisieren [Tim O Brien et al., 2010, Kapitel , What is Inversion of Control?]. Das Framework und weiterführende Informationen finden sich unter: Siehe auch [Tim O Brien et al., 2010, Kapitel , Why Plexus?]. Es kann an dieser Stelle keine komplette Einführung in Plexus erfolgen. Die Verwendung von Plexus soll aber beispielhaft am Maven Quellcode gezeigt werden. Es wird hier der gekürzte Ausschnitt aus DefaultMavenPluginManager.java gezeigt, der das Laden von Mojos über Plexus realisiert: package org.apache.maven.plugin.internal; public class DefaultMavenPluginManager // implements... private PlexusContainer container; public <T> T getconfiguredmojo( Class<T> mojointerface,..., MojoExecution mojoexecution ) // throws... MojoDescriptor mojodescriptor = mojoexecution.getmojodescriptor(); T mojo; mojo = container.lookup( mojointerface, mojodescriptor.getrolehint() ); populatepluginfields( mojo, mojodescriptor,... ); return mojo; 23

26 Innerhalb der Methode getconfiguredmojo() wird das Mojo über ein PlexusContainer Objekt mittels lookup() geladen. Die Methode populatepluginfields() übernimmt, mit der Hilfe von Plexus, anschließend die Dependency Injection der Mojo Felder. Die lookup() Methode ist in Plexus definiert als: package org.codehaus.plexus; public class DefaultPlexusContainer // extends... implements... public <T> T lookup( Class<T> type, String rolehint ) throws ComponentLookupException return componentregistry.lookup( type, type.getname(), rolehint ); Sie erhält zwei Parameter: Der Parameter type bezeichnet die Klasse oder das Interface des gewünschten Objektes. Mit rolehint wird das Objekt in einer Menge möglicher Kandidaten exakt bestimmt. Hier bestünde die Menge möglicher Kandidaten aus allen Mojo implementierenden Klassen. Über den Parameter rolehint kann dann, die für ein bestimmtes Goal benötigte Mojo Klasse genau bestimmt werden. Die Funktion getconfiguredmojo() liefert das fertig konstruierte Mojo an den Aufrufer zurück. Dies ist die Methode executemojo() in der Klasse DefaultBuildPluginManager.java. Hier wird schließlich die aus Kapitel bekannte execute() Methode des Mojos aufgerufen: package org.apache.maven.plugin; public class DefaultBuildPluginManager // implements... private MavenPluginManager mavenpluginmanager; public void executemojo( MavenSession session, MojoExecution mojoexecution ) // throws... Mojo mojo = null; mojo = mavenpluginmanager.getconfiguredmojo( Mojo.class, session, mojoexecution ); mojo.execute(); 24

27 5. Zusammenfassung und Ausblick 5.1. Zusammenfassung Kapitel 1 stellt Apache Maven als Open Source Build Management System für Java Projekte vor. Ein praktisch orientierter Einstieg in Maven beginnt in Kapitel 2 mit einer Kurzfassung wesentlicher Grundlagen. In Kapitel 3 wird ein exemplarisch gewähltes JNI Projekt von ANT nach Maven portiert. Es werden die Unterschiede zu ANT dargelegt und die Probleme bei der Portierung aufgezeigt. Um diese zu lösen, geht Kapitel 4 zunächst auf architektonische Aspekte von Maven ein und beschreibt es als Plugin-Framework. Zum erfolgreichen Bau des JNI Projektes wird, darauf aufbauend, ein neues Maven Plugin entwickelt. Zum Verständnis des Plugins, werden relevante Techniken (Dependency Injection) und benutzte Frameworks (Plexus) kurz vorgestellt Ausblick Write programs that do one thing and do it well. Wikipedia [2011] Maven vereint viel Funktionalität. Erfolgreiche Software erkennt man aber oft an einer scharfen funktionalen Begrenzung bei einem klar definierten Einsatzzweck. Ein exemplarisches Beispiel für diese Theorie soll die Mozilla Suite sein. Die Mozilla Suite kombiniert Browser, -Client, Adressbuch und einen HTML Composer. Ihre offizielle Weiterentwicklung wurde von der Mozilla Foundation jedoch zu Gunsten von Firefox eingestellt - einem reinen Browser. Auch Thunderbird, ein aus der Mozilla Suite isolierter -Client, hat respektablen Erfolg. Als Begründung für die offizielle Einstellung der Weiterentwicklung wird genannt: Der Hauptgrund für diese Änderung [die Konzentration auf die Weiterentwicklung von Firefox und Thunderbird] ist, dass die Akzeptanz von Einzelapplikationen bei den Anwendern als höher angenommen wurde als die einer kompletten Applikationssuite [...] 20 Die Mozilla Suite wird als unabhängiges Projekt namens SeaMonkey weiterentwickelt 21. Ein Blick auf eine aktuelle Browserstatistik 22 zeigt, dass SeaMonkey aber nur noch marginale Bedeutung hat. Rule of Composition: Design programs to be connected to other programs. Wikipedia [2011] Übertragen auf Maven wäre insbesondere zu fragen, ob Repository-Verwaltung, Dependency Management und Build Tool sich separiert nicht erfolgreicher weiterentwickeln können als der kombinierte Ansatz von Maven. Dazu wäre insbesondere die Annahme zu untersuchen, dass mit zunehmender Kopplung unterschiedlicher Funktionalitäten, die universelle Verwendbarkeit

Buildsystem. Maven & Scons. Controls Entwicklungsforum Januar 2012

Buildsystem. Maven & Scons. Controls Entwicklungsforum Januar 2012 Buildsystem Maven & Scons Controls Entwicklungsforum Januar 2012 1 2 a call from the past Binary Repository Speichern von Artefakten (z.b. Shared Library und zugehörige Header) Versionierung von Artefakten

Mehr

ANT. Kurzvortrag von Manuel Schulze. mschulze@inf.fu-berlin.de

ANT. Kurzvortrag von Manuel Schulze. mschulze@inf.fu-berlin.de ANT Kurzvortrag von Manuel Schulze mschulze@inf.fu-berlin.de ANT Überblick Teilprojekt der Apache Software Foundation [1] ANT ist Opensource Build-Tool ähnlich wie make (?) jedoch voll auf Java zugeschnitten

Mehr

Der Weisheit letzter Schluss:

Der Weisheit letzter Schluss: Der Weisheit letzter Schluss: Maven 2 in der Java Entwicklung Web Site: www.soebes.de Blog: blog.soebes.de Email: info@soebes.de Dipl.Ing.(FH) Karl Heinz Marbaise Agenda 1. Was ist Maven? 2. Features von

Mehr

Maven 2 Softwareprojekte mit Kultur

Maven 2 Softwareprojekte mit Kultur Maven 2 Softwareprojekte mit Kultur Patrick Zeising 28.05.2010 Motivation Projekte unterscheiden sich stark im Aufbau Abläufe beim Übersetzen und Deployen unterscheiden sich stark

Mehr

Seminar - Bericht. Maven Project Management & Comprehension. Fachhochschargau Departement Technik Studiengang Informatik. Gruppe Jonas Weibel

Seminar - Bericht. Maven Project Management & Comprehension. Fachhochschargau Departement Technik Studiengang Informatik. Gruppe Jonas Weibel Seminar - Bericht Maven Project Management & Comprehension Fachhochschargau Departement Technik Studiengang Informatik Gruppe Jonas Weibel Betreuender Dozent Prof. Dr. Dominik Gruntz Windisch, im Januar

Mehr

Das Build Tool Ant. Sebastian Mancke, mancke@mancke-software.de

Das Build Tool Ant. Sebastian Mancke, mancke@mancke-software.de Das Build Tool Ant Sebastian Mancke, mancke@mancke-software.de Grundlagen Motivation Bei der Übersetzung und Pflege von Software treten viele, gleich bleibende Arbeitsschritte auf. Übersetzen des Codes

Mehr

Softwareprojekte mit Kultur

Softwareprojekte mit Kultur Maven Softwareprojekte mit Kultur Patrick Zeising Konfigurationsmanagement Motivation Projektaufbau unterschiedlich Abläufe zum Übersetzen und Deployen unterschiedlich Verwendete Tools, Prozesse, Skripte

Mehr

Programmieren in Java

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

Mehr

Builddreikampf: Ant, Maven und Gradle. Sven Bunge / Carl Düvel

Builddreikampf: Ant, Maven und Gradle. Sven Bunge / Carl Düvel Builddreikampf: Ant, Maven und Gradle Sven Bunge / Carl Düvel holisticon AG Wettkampfplan 1. Die Regeln 2. Vorstellung der Kandidaten 3. Ring frei die Disziplinen! 1. Dependency Management 2. Multiprojektsupport

Mehr

Buildwerkzeuge für Javaprojekte. Christian Bunse Institut für Informatik 03.07.2008

Buildwerkzeuge für Javaprojekte. Christian Bunse Institut für Informatik 03.07.2008 Buildwerkzeuge für Javaprojekte Christian Bunse Institut für Informatik 03.07.2008 Inhalt Der Build Besonderheiten von Javaprojekten Ziele von Buildwerkzeugen Continuous Integration Vorstellung von Buildwerkzeugen

Mehr

Maven 2.0. DRV Jahrestagung Java Würzburg 26.2.2008 Rainer Vehns, codecentric GmbH. 2008 codecentric GmbH

Maven 2.0. DRV Jahrestagung Java Würzburg 26.2.2008 Rainer Vehns, codecentric GmbH. 2008 codecentric GmbH Maven 2.0 DRV Jahrestagung Java Würzburg 26.2.2008 Rainer Vehns, codecentric GmbH Agenda Einführung Project Object Model (POM) Repositories Maven und Eclipse Maven - LIVE 1. EINFÜHRUNG Einführung - Was

Mehr

Einführung in Maven und GWT

Einführung in Maven und GWT Einführung in Maven und GWT Prof. Christoph Knabe Beuth-Hochschule Berlin 08.05.2014 Gliederung Motivation für Build-Werkzeug Maven-Ziele, Begriffe Maven-Benutzung in 5 min Maven-Vorteile GWT-Ziele GWT-Projekt

Mehr

Automatischer Build mit Maven 2

Automatischer Build mit Maven 2 Automatischer Build mit Maven 2 Stefan Scheidt OPITZ CONSULTING GmbH Ihr Referent Stefan Scheidt Senior Architekt bei der OPITZ CONSULTING GmbH Seit über 10 Jahren im Oracle- und Java-Umfeld tätig Schwerpunkte:

Mehr

Eclipse und Java Einheit 06: Building Eclipse Projete mit Ant

Eclipse und Java Einheit 06: Building Eclipse Projete mit Ant Eclipse und Java Einheit 06: Building Eclipse Projete mit Ant Laith Raed Ludwig-Maximilians-Universität München Institut für Informatik: Programmierung und Softwaretechnik Prof.Wirsing Inhaltsverzeichnis

Mehr

Verteilte Systeme (WS 2013/14) Übung 0: Einführung in Maven und Git. Oliver Kleine Institut für Telematik, Universität zu Lübeck

Verteilte Systeme (WS 2013/14) Übung 0: Einführung in Maven und Git. Oliver Kleine Institut für Telematik, Universität zu Lübeck Verteilte Systeme (WS 2013/14) Übung 0: Einführung in Maven und Git Oliver Kleine Institut für Telematik, Universität zu Lübeck Build-Management in JAVA 3 Build-Management? Wozu? Traditionelle manuelle

Mehr

Kurzanleitung zu XML2DB

Kurzanleitung zu XML2DB Kurzanleitung zu XML2DB Inhaltsverzeichnis 1. Einleitung...3 2. Entwicklungsumgebung...3 3. Betriebsanleitung...3 3.1 Einrichten der Java Umgebung...3 3.2 Allgemeines zu java und javac...4 3.2.1 Allgemeines

Mehr

Vom lokalen Build zum Deployment

Vom lokalen Build zum Deployment Vom lokalen Build zum Deployment International PHP Conference Manuel Pichler 12.10.2011 Vom lokalen Build zum Deployment 1 / 36 Über mich Diplominformatiker Mehr als 10 Jahre Erfahrung im PHP-Umfeld Autor

Mehr

1 Welches Problem löst Maven?

1 Welches Problem löst Maven? 1 Welches Problem löst Maven? Maven kann den kompletten Projektlifecycle verwalten und im Speziellen die internen und externen Abhängigkeiten eines Projekts managen. Im Wesentlichen geschieht dies über

Mehr

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck Javadoc Programmiermethodik Eva Zangerle Universität Innsbruck Überblick Einführung Java Ein erster Überblick Objektorientierung Vererbung und Polymorphismus Ausnahmebehandlung Pakete und Javadoc Spezielle

Mehr

Buildmanagement. Konstantin Domoratskyy

Buildmanagement. Konstantin Domoratskyy Buildmanagement Konstantin Domoratskyy Alle Tätigkeiten, die man bereits zwei mal manuell durchgeführt hat, sollen automatisiert werden. Mike Clark 20.05.08 Konstantin Domoratskyy: Buildmanagement 2 Inhalt

Mehr

Software-Engineering 2: Automatische Build-Werkzeuge

Software-Engineering 2: Automatische Build-Werkzeuge Software-Engineering 2: Automatische Build-Werkzeuge Prof. Dr. Axel Böttcher 22. Oktober 2012 Motivation 1 Entwicklungprozesse in der Praxis, Beispiel Facbook: Our development cycle is extremely fast,

Mehr

Einführung in die Informatik Tools

Einführung in die Informatik Tools Einführung in die Informatik Tools Werkzeuge zur Erstellung von Softwareprojekten Wolfram Burgard 8.1 Motivation Große Softwareprojekte werden schnell unübersichtlich. Änderungen im Code können leicht

Mehr

Build Management. Präsentation von Daniel Mies daniel.mies@1und1.de

Build Management. Präsentation von Daniel Mies daniel.mies@1und1.de Build Management Präsentation von Daniel Mies daniel.mies@1und1.de Agenda 1&1 Member of United Internet Build Management mit Maven Motivation Kompilieren & Paketieren Dependency Management Software Analyse

Mehr

Persönliche Build-Höllen für Jedermann Andreas Hartmann & Dr. Halil-Cem Gürsoy

Persönliche Build-Höllen für Jedermann Andreas Hartmann & Dr. Halil-Cem Gürsoy Über Ant und Maven zu SBT und Gradle Persönliche Build-Höllen für Jedermann Andreas Hartmann & Dr. Halil-Cem Gürsoy 07.04.2011 Speaker Andreas Hartmann [hartmann@adesso.de] Principal Software Engineer

Mehr

Modulare Anwendungen und die Lookup API. Geertjan Wielenga NetBeans Team Deutschsprachige Überarbeitung, Aljoscha Rittner NetBeans Dream Team

Modulare Anwendungen und die Lookup API. Geertjan Wielenga NetBeans Team Deutschsprachige Überarbeitung, Aljoscha Rittner NetBeans Dream Team Modulare Anwendungen und die Lookup API Geertjan Wielenga NetBeans Team Deutschsprachige Überarbeitung, Aljoscha Rittner NetBeans Dream Team Die Notwendigkeit modularer Anwendungen Die Notwendigkeit modularer

Mehr

Übung: Verwendung von Java-Threads

Übung: Verwendung von Java-Threads Übung: Verwendung von Java-Threads Ziel der Übung: Diese Übung dient dazu, den Umgang mit Threads in der Programmiersprache Java kennenzulernen. Ein einfaches Java-Programm, das Threads nutzt, soll zum

Mehr

JBuilderX: Installation und Kurzanleitung (Windows)

JBuilderX: Installation und Kurzanleitung (Windows) JBuilder X Seite 1 JBuilderX: Installation und Kurzanleitung (Windows) 1. JBuilder installieren Eine Gratis-Version kann von der Webseite www.borland.de heruntergeladen werden. Systemvoraussetzungen: 256

Mehr

Ant - das Java Build-Tool

Ant - das Java Build-Tool Hauptseminar Ant - das Java Build-Tool Funktionalität, Mächtigkeit und Praxiserfahrungen Betreuer: Vortragender: Dipl.Inf. Thorsten Strufe Christoph Lühr Gliederung Build-Tools Aufgaben und Probleme Ant

Mehr

Handbuch für die Erweiterbarkeit

Handbuch für die Erweiterbarkeit Handbuch für die Erweiterbarkeit Inhalt Pakete für die Erweiterbarkeit... 2 Actions... 2 Items... 2 Itemset... 2 Die UseCaseNewAction... 3 Eigene Shapes... 4 Der Shape Container... 5 User Objects... 6

Mehr

Einführung in Javadoc

Einführung in Javadoc Einführung in Javadoc Johannes Rinn http://java.sun.com/j2se/javadoc Was ist Javadoc? Javadoc ist ein Werkzeug, dass eine standardisierte Dokumentation für die Programmiersprache Java unterstützt. Vorteil:

Mehr

Software Engineering II

Software Engineering II Software Engineering II Codegenerierung für den SmartIO Editor mit der Modeling Workflow Engine Wintersemester 10/111 Fachgebiet Software Engineering Albert Zündorf / Wiederholung Bisher im Laufe des Semesters

Mehr

JCoverage. Uni Kassel Projektarbeit Software Engineering 12.11.2003. Markus Pilsl & Marko Medved

JCoverage. Uni Kassel Projektarbeit Software Engineering 12.11.2003. Markus Pilsl & Marko Medved JCoverage Uni Kassel Projektarbeit Software Engineering 12.11.2003 Markus Pilsl & Marko Medved Was ist JCoverage Tool, welches anzeigt, wie oft jede wichtige Zeile des Quellcodes getestet wurde Soll helfen

Mehr

Praktikum Spring MVC. 1.2. Spring integrieren In der pom.xml Einträge für Spring hinzufügen.

Praktikum Spring MVC. 1.2. Spring integrieren In der pom.xml Einträge für Spring hinzufügen. Praktikum Spring MVC Aufgabe 1 Im ersten Teil des Praktikums wird eine Test Webapplikation entwickelt, anhand derer einige Konzepte von Spring nachvollzogen werden können. Dabei handelt es sich um Spring

Mehr

Erstellung eines SharkNet Installers für Windows mit Inno Setup Compiler 5.4.2

Erstellung eines SharkNet Installers für Windows mit Inno Setup Compiler 5.4.2 Erstellung eines SharkNet Installers für Windows mit Inno Setup Compiler 5.4.2 1. Benötigte Software Zur Erstellung des Installers wird folgende Software benötigt. Es wird sich in dieser Dokumentation

Mehr

Programmieren in Java

Programmieren in Java Programmieren in Java objektorientierte Programmierung 2 2 Zusammenhang Klasse-Datei In jeder *.java Datei kann es genau eine public-klasse geben wobei Klassen- und Dateiname übereinstimmen. Es können

Mehr

Installation und Benutzung AD.NAV.ZipTools

Installation und Benutzung AD.NAV.ZipTools Installation und Benutzung AD.NAV.ZipTools Version 1.0.0.0 ALTENBRAND Datentechnik GmbH Am Gelicht 5 35279 Neustadt (Hessen) Tel: 06692/202 290 Fax: 06692/204 741 email: support@altenbrand.de Die Komponente

Mehr

4 Vererbung, Polymorphie

4 Vererbung, Polymorphie 4 Vererbung, Polymorphie Jörn Loviscach Versionsstand: 21. März 2014, 22:57 Die nummerierten Felder sind absichtlich leer, zum Ausfüllen beim Ansehen der Videos: http://www.j3l7h.de/videos.html This work

Mehr

RIWA NetUpdater Tool für automatische Daten- und Softwareupdates

RIWA NetUpdater Tool für automatische Daten- und Softwareupdates RIWA NetUpdater Tool für automatische Daten- und Softwareupdates Grundlegendes... 1 Ausführbare Dateien und Betriebsmodi... 2 netupdater.exe... 2 netstart.exe... 2 netconfig.exe... 2 nethash.exe... 2 Verzeichnisse...

Mehr

Build-Prozesse für Geschäftsanwendungen mit Apache Maven

Build-Prozesse für Geschäftsanwendungen mit Apache Maven Build-Prozesse für Geschäftsanwendungen mit Apache Maven Was sind eigentlich Geschäftsanwendungen? Geschäftsanwendungen (z.b. ERP) potenziell viele Benutzer in unterschiedlichen Rollen und unterschiedlichen

Mehr

Programmentwicklung ohne BlueJ

Programmentwicklung ohne BlueJ Objektorientierte Programmierung in - Eine praxisnahe Einführung mit Bluej Programmentwicklung BlueJ 1.0 Ein BlueJ-Projekt Ein BlueJ-Projekt ist der Inhalt eines Verzeichnisses. das Projektname heißt wie

Mehr

Build-Management. Der Einsatz von Make, Ant und Maven und Co. Prof. Dr. Nikolaus Wulff

Build-Management. Der Einsatz von Make, Ant und Maven und Co. Prof. Dr. Nikolaus Wulff Build-Management Der Einsatz von Make, Ant und Maven und Co. Prof. Dr. Nikolaus Wulff Integrierter Arbeitsplatz Eine IDE wie Eclipse, JBuilder oder NetBeans unterstützt die alltägliche Arbeit. Sie bietet

Mehr

Grundlagen des Buildmanagement- Tools Apache Maven

Grundlagen des Buildmanagement- Tools Apache Maven Grundlagen des Buildmanagement- Tools Apache Maven Seminararbeit im Studiengang Scientific Programming vorgelegt von Sinan Böcker Matr.-Nr.: 836951 am 15. Dezember 2011 an der Fachhochschule Aachen Erstprüfer:

Mehr

Starthilfe für C# Inhaltsverzeichnis. Medien- und Kommunikationsinformatik (B.Sc.) Alexander Paharukov. Informatik 3 Praktikum

Starthilfe für C# Inhaltsverzeichnis. Medien- und Kommunikationsinformatik (B.Sc.) Alexander Paharukov. Informatik 3 Praktikum Starthilfe für C# Inhaltsverzeichnis Allgemeines... 2 Bezugsquellen... 2 SharpDevelop... 2.NET Runtime... 2.NET SDK... 2 Installation... 2 Reihenfolge... 2 Vorschlag für eine Ordnerstruktur... 3 Arbeit

Mehr

Wie konfiguiriert man Eclipse (mit oder ohne Plugin) Erich Ehses

Wie konfiguiriert man Eclipse (mit oder ohne Plugin) Erich Ehses Wie konfiguiriert man Eclipse (mit oder ohne Plugin) Erich Ehses Man kann die nötigen Dateien separat von den angegebenen Quellen beziehen oder das Eclipse- Plugin für java_cup verwenden. Am Ende benötigt

Mehr

B) Klassenbibliotheken Turtle und Util (GPanel, Console) installieren Ein Unterverzeichnis classes auf der Festplatte erstellen, z.b.

B) Klassenbibliotheken Turtle und Util (GPanel, Console) installieren Ein Unterverzeichnis classes auf der Festplatte erstellen, z.b. jcreator Seite 1 JCreator (Windows) 1. Installation Die wichtigsten Installationsschritte: A) Java 2 Development Kit J2SE 5.0 RC installieren. Die aktuelle Installationsdatei (jdk-1_5_09-rc-windows-i586.exe)

Mehr

Projekt AGB-10 Fremdprojektanalyse

Projekt AGB-10 Fremdprojektanalyse Projekt AGB-10 Fremdprojektanalyse 17. Mai 2010 1 Inhaltsverzeichnis 1 Allgemeines 3 2 Produktübersicht 3 3 Grundsätzliche Struktur und Entwurfsprinzipien für das Gesamtsystem 3 3.1 Die Prefuse Library...............................

Mehr

Grundlagen der Verwendung von make

Grundlagen der Verwendung von make Kurzskript zum Thema: Grundlagen der Verwendung von make Stefan Junghans Gregor Gilka 16. November 2012 1 Einleitung In diesem Teilskript sollen die Grundlagen der Verwendung des Programmes make und der

Mehr

Kapitel 6. Vererbung

Kapitel 6. Vererbung 1 Kapitel 6 2 Ziele Das sprinzip der objektorientierten Programmierung verstehen Und in Java umsetzen können Insbesondere folgende Begriffe verstehen und anwenden können: Ober/Unterklassen Subtyping Überschreiben

Mehr

Prinzipien Objektorientierter Programmierung

Prinzipien Objektorientierter Programmierung Prinzipien Objektorientierter Programmierung Valerian Wintner Inhaltsverzeichnis 1 Vorwort 1 2 Kapselung 1 3 Polymorphie 2 3.1 Dynamische Polymorphie...................... 2 3.2 Statische Polymorphie........................

Mehr

Ant in Eclipse Starthilfe

Ant in Eclipse Starthilfe IN DIESER KURSEINHEIT Einleitung o Um was geht's eigentlich? Hello World o Das Ant Skript Mehrere Targets und Properties o Hello World Ausgabe Ant Launch Configurations o Definition o Modifikation o Nutzung

Mehr

B) Klassenbibliotheken Turtle und Util (GPanel, Console) installieren Ein Unterverzeichnis classes auf der Festplatte erstellen, z.b.

B) Klassenbibliotheken Turtle und Util (GPanel, Console) installieren Ein Unterverzeichnis classes auf der Festplatte erstellen, z.b. jcreator Seite 1 JCreator (Windows) JCreator ist eine einfache, schnelle und effiziente Java-DIE. Eine gratis Testversion sowie eine academic Lizenz für $35.- kann von der Website www.jcreator.com heruntergeladen

Mehr

Prüfungszeuch im Fach Objektorientierte Programmierung WS 2000

Prüfungszeuch im Fach Objektorientierte Programmierung WS 2000 Prüfungszeuch im Fach Objektorientierte Programmierung WS 2000 A. Beschreibung der Projektarbeit. Welche Aufgabe haben Sie im Rahmen der Projektarbeit gelöst? 2. Mit welchen Tools bzw. Programmen (Anwendung,

Mehr

Anleitung Command Line Client Demo Client

Anleitung Command Line Client Demo Client Stiftung Auffangeinrichtung BVG Fondation institution supplétive LPP Fondazione istituto collettore LPP Anleitung Command Line Client Demo Client Version 1.1 Inhalt 1. Allgemein... 3 1.1. Installieren

Mehr

Welches hätten Sie denn gerne? Markus Stäuble, CTO, namics (deutschland) GmbH

Welches hätten Sie denn gerne? Markus Stäuble, CTO, namics (deutschland) GmbH Buildsysteme Welches hätten Sie denn gerne? Markus Stäuble, CTO, namics (deutschland) GmbH Kurze Vorstellung: about me Markus Stäuble CTO bei namics (deutschland) GmbH Programmierung mit Java seit Version

Mehr

Anzeige des Java Error Stack in Oracle Forms

Anzeige des Java Error Stack in Oracle Forms Anzeige des Java Error Stack in Oracle Forms (Version 2.0) Juni 2008 Autoren: Jürgen Menge / Thomas Robert Seite 1 von 7 Oracle Forms bietet seit der Version 6i die Möglichkeit, serverseitig Java-Klassen

Mehr

Kapitel 6. Vererbung

Kapitel 6. Vererbung 1 Kapitel 6 2 Ziele Das sprinzip der objektorientierten Programmierung verstehen Und in Java umsetzen können Insbesondere folgende Begriffe verstehen und anwenden können: Ober/Unterklassen Subtyping Überschreiben

Mehr

JBoss 2.2 Evaluierung

JBoss 2.2 Evaluierung Freie Universität Berlin Autor: Natalie Ardet Datum: 10.4.2001 JBoss 2.2 Evaluierung Projekt: verteilte Informationssysteme JBoss 2.2 Evaluierung Windows NT 4.0 Installation/Konfiguration und Together

Mehr

Unit Tests. Programmiermethodik. Eva Zangerle Universität Innsbruck

Unit Tests. Programmiermethodik. Eva Zangerle Universität Innsbruck Unit Tests Programmiermethodik Eva Zangerle Universität Innsbruck Überblick Einführung Java Ein erster Überblick Objektorientierung Vererbung und Polymorphismus Ausnahmebehandlung Pakete und Javadoc Spezielle

Mehr

Maven Installation Guide Dipl.-Inf. Manfred Wolff in Zusammenarbeit mit der NEUSTA GmbH Version 1.0 2004 all rights reserved.

Maven Installation Guide Dipl.-Inf. Manfred Wolff in Zusammenarbeit mit der NEUSTA GmbH Version 1.0 2004 all rights reserved. Maven Installation Guide Dipl.-Inf. Manfred Wolff in Zusammenarbeit mit der NEUSTA GmbH Version 1.0 2004 all rights reserved. Installation und Grundkonfiguration von Maven Die aktuelle Version von Mavin

Mehr

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 16: 3-Schichten-Architektur 1 Fachkonzept - GUI

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 16: 3-Schichten-Architektur 1 Fachkonzept - GUI Universität Osnabrück Drei-Schichten-Architektur 3 - Objektorientierte Programmierung in Java Vorlesung 6: 3-Schichten-Architektur Fachkonzept - GUI SS 2005 Prof. Dr. F.M. Thiesing, FH Dortmund Ein großer

Mehr

SEW Übung EMFText. 1 Aufgabe. 2 Domänenbeschreibung. 3 Installation von Eclipse/EMFText. 4 Schritt-für-Schritt Anleitung. 4.

SEW Übung EMFText. 1 Aufgabe. 2 Domänenbeschreibung. 3 Installation von Eclipse/EMFText. 4 Schritt-für-Schritt Anleitung. 4. SEW Übung EMFText 1 Aufgabe Erstellen Sie eine textuelle Domänenspezifische Sprache Domain-specific Language (DSL) mit dem Werkzeug EMFText. Die Sprache soll dazu dienen Formulare (Fragen, Antworttypen

Mehr

Java für C++ Programmierer

Java für C++ Programmierer Java für C++ Programmierer Alexander Bernauer bernauer@inf.ethz.ch Einführung in die Übungen zu Informatik II (D ITET) FS2010 ETH Zürich Ziel Allgemeiner Überblick Kennenlernen der Suchbegriffe Warum Java?

Mehr

Pakete dienen dazu, die Software eines Projektes in größere inhaltlich zusammengehörige Bereiche mit eigenem Namen einzuteilen (siehe Java API).

Pakete dienen dazu, die Software eines Projektes in größere inhaltlich zusammengehörige Bereiche mit eigenem Namen einzuteilen (siehe Java API). Paketdeklaration Paketdeklaration package Bezeichner ; Pakete dienen dazu, die Software eines Projektes in größere inhaltlich zusammengehörige Bereiche mit eigenem Namen einzuteilen (siehe Java API). Ein

Mehr

Komponentenbasierte Softwareentwicklung mit PHP. Oliver Schlicht - bitexpert

Komponentenbasierte Softwareentwicklung mit PHP. Oliver Schlicht - bitexpert Komponentenbasierte Softwareentwicklung mit PHP Oliver Schlicht - bitexpert Überblick 1. Was ist eine Komponente? 2. Entwicklung eines Beispieldesigns 3. Dependency Injection 4. DI Container Garden 5.

Mehr

Inhaltsverzeichnis. 2 Einrichten von Eclipse 5 2.1 Herunterladen von Eclipse Classic... 5 2.2 Workspace anlegen... 6 2.3 Projekte Importieren...

Inhaltsverzeichnis. 2 Einrichten von Eclipse 5 2.1 Herunterladen von Eclipse Classic... 5 2.2 Workspace anlegen... 6 2.3 Projekte Importieren... Inhaltsverzeichnis 1 Installation des JDK 2 1.1 Herunterladen des JDK................................. 2 1.2 Installation des JDK................................... 2 1.3 Umgebungsvariable für das JDK

Mehr

Technische Beschreibung: EPOD Server

Technische Beschreibung: EPOD Server EPOD Encrypted Private Online Disc Technische Beschreibung: EPOD Server Fördergeber Förderprogramm Fördernehmer Projektleitung Projekt Metadaten Internet Foundation Austria netidee JKU Linz Institut für

Mehr

Bedienung von BlueJ. Klassenanzeige

Bedienung von BlueJ. Klassenanzeige Im Folgenden werden wichtige Funktionen für den Einsatz von BlueJ im Unterricht beschrieben. Hierbei wird auf den Umgang mit Projekten, Klassen und Objekten eingegangen. Abgeschlossen wird dieses Dokument

Mehr

Kapitel 6. Vererbung

Kapitel 6. Vererbung Kapitel 6 Vererbung Vererbung 1 Ziele Das Vererbungsprinzip der objektorientierten Programmierung verstehen Und in Java umsetzen können Insbesondere folgende Begriffe verstehen und anwenden können: Ober/Unterklassen

Mehr

Nutzung der VDI Umgebung

Nutzung der VDI Umgebung Nutzung der VDI Umgebung Inhalt 1 Inhalt des Dokuments... 2 2 Verbinden mit der VDI Umgebung... 2 3 Windows 7... 2 3.1 Info für erfahrene Benutzer... 2 3.2 Erklärungen... 2 3.2.1 Browser... 2 3.2.2 Vertrauenswürdige

Mehr

PIWIN 1 Übung Blatt 5

PIWIN 1 Übung Blatt 5 Fakultät für Informatik Wintersemester 2008 André Gronemeier, LS 2, OH 14 Raum 307, andre.gronemeier@cs.uni-dortmund.de PIWIN 1 Übung Blatt 5 Ausgabedatum: 19.12.2008 Übungen: 12.1.2009-22.1.2009 Abgabe:

Mehr

C++ mit Eclipse & GCC unter Windows

C++ mit Eclipse & GCC unter Windows C++ mit Eclipse & GCC Seite 1 / 14 C++ mit Eclipse & GCC unter Windows Hinweise Stand 18. Okt. 2014 => GCC 4.9.1 Boost 1.56.0 Eclipse Luna V. 4.4.1 Java Version 8, Update 25 (entspricht 1.8.0_25) Achtung

Mehr

Mit dem 'Skeleton' zur eigenen Anwendung

Mit dem 'Skeleton' zur eigenen Anwendung Mit dem 'Skeleton' zur eigenen Anwendung 2015-11-10 by Kathleen Neumann, Wiebke Oeltjen, Robert Stephan Zur Entwicklung einer eigenen MyCoRe-Anwendung stellen wir ein Anwendungsgerüst zur Verfügung, das

Mehr

Abschnitt 9: Schnittstellen: Interfaces

Abschnitt 9: Schnittstellen: Interfaces Abschnitt 9: Schnittstellen: Interfaces 9. Schnittstellen: Interfaces 9.1 Die Idee der Schnittstellen 9.2 Schnittstellen in Java 9.3 Marker-Interfaces 9.4 Interfaces und Hilfsklassen 9.5 Zusammenfassung

Mehr

Factory Method (Virtual Constructor)

Factory Method (Virtual Constructor) Factory Method (Virtual Constructor) Zweck: Definition einer Schnittstelle für Objekterzeugung Anwendungsgebiete: Klasse neuer Objekte bei Objekterzeugung unbekannt Unterklassen sollen Klasse neuer Objekte

Mehr

Das Build-Tool ANT ETIS SS05

Das Build-Tool ANT ETIS SS05 Das Build-Tool ANT ETIS SS05 Motivation Build - Datei Allgemeiner Aufbau Project Target Task Properties Zusammenfassung Literatur Gliederung 2 Motivation ANT I open source-projekt (aktuell: Version 1.6.5)

Mehr

Gliederung. Einführung. Kleines Maven Wörterbuch. Maven im Unternehmenseinsatz. Was bringt die Zukunft?

Gliederung. Einführung. Kleines Maven Wörterbuch. Maven im Unternehmenseinsatz. Was bringt die Zukunft? Build Management, Teil 2: Apache Maven mehr als nur Ant Facelifting Kristian Köhler Steffen Schluff Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: 1.0 www.oio.de info@oio.de Gliederung

Mehr

Spring Dynamic Modules for OSGi Service Platforms

Spring Dynamic Modules for OSGi Service Platforms Gerd Wütherich freiberuflicher Softwarearchitekt Spring Dynamic Modules for OSGi Service Platforms Server Anwendungen mit Spring und Eclipse Equinox Agenda OSGi Technologie: OSGi Technologie im Überblick

Mehr

Automatisierte Erstellung von Software-Builds und -dokumentationen. Teil 1

Automatisierte Erstellung von Software-Builds und -dokumentationen. Teil 1 Automatisierte Erstellung von Software-Builds und -dokumentationen Teil 1 Autoren: Hagedorn, Robert; Denninger, Oliver Kontakt: {hagedorn denninger}@fzi.de Web: http://zfs.fzi.de Ort, Datum: Karlsruhe,

Mehr

CVS-Einführung. Sebastian Mancke, mancke@mancke-software.de

CVS-Einführung. Sebastian Mancke, mancke@mancke-software.de CVS-Einführung Sebastian Mancke, mancke@mancke-software.de Grundlagen Motivation und Anforderung Sobald ein Softwaresystem anwächst, ergeben sich Probleme im Umgang mit dem Quell Code. CVS (Concurrent

Mehr

ObjectBridge Java Edition

ObjectBridge Java Edition ObjectBridge Java Edition Als Bestandteil von SCORE Integration Suite stellt ObjectBridge Java Edition eine Verbindung von einem objektorientierten Java-Client zu einer fast beliebigen Server-Komponente

Mehr

Python SVN-Revision 12

Python SVN-Revision 12 Python SVN-Revision 12 Uwe Ziegenhagen 7. Januar 2012 Vorwort Dieses Skript erhebt keinen Anspruch auf Vollständigkeit oder Richtigkeit. Es wird geschrieben, um mir als Gedächtnisstütze für den Umgang

Mehr

Workbooster File Exchanger Command Line Tool

Workbooster File Exchanger Command Line Tool Thema Technische Benutzerdokumentation - WBFileExchanger Workbooster File Exchanger Command Line Tool Letzte Anpassung 18. Januar 2014 Status / Version Finale Version - V 1.1 Summary Erstellung Diese technische

Mehr

Eclipse 3.0 (Windows)

Eclipse 3.0 (Windows) Eclipse Seite 1 Eclipse 3.0 (Windows) 1. Eclipse installieren Eclipse kann man von der Webseite http://www.eclipse.org/downloads/index.php herunterladen. Eclipse ist für Windows, Mac und Linux erhältlich.

Mehr

Reflection. Arthur Zaczek. Nov 2014

Reflection. Arthur Zaczek. Nov 2014 Arthur Zaczek Nov 2014 1 Einleitung 1.1 Definition Reflection ist das Auslesen von Metainformationen über Klassen, deren Methoden & Eigenschaften zur Laufzeit. 1.2 Anwendungsfälle Analyse von Programmen

Mehr

Das Test-Framework JUnit ETIS SS04

Das Test-Framework JUnit ETIS SS04 Das Test-Framework JUnit ETIS SS04 Gliederung Motivation TestFirst Grundlagen Assert TestCase Lebenszyklus TestCase UML-Diagramm TestCase TestSuite Zusammenfassung 2 Motivation (I) Kostspielige Folgen

Mehr

Software-Engineering Grundlagen des Software-Engineering

Software-Engineering Grundlagen des Software-Engineering Software-Engineering Grundlagen des Software-Engineering 7.2 Programmentwicklung und Debuggen mit IDE und CASE-Tools Übungen Prof. Dr. Rolf Dornberger SWE: 7.2 Programmentwicklung und Debuggen mit IDE

Mehr

1. Einführung. 2. Vorbereitung zur Installation. 1.1 Eclipse

1. Einführung. 2. Vorbereitung zur Installation. 1.1 Eclipse 1. Einführung 1.1 Eclipse Die Eclipse ist eine kostenlose integrierte Entwicklungsumgebung oder auch IDE genannt, (Abkürzung IDE, engl. Integrated development enviroment). Sie ist eine grafische Benutzeroberfläche

Mehr

Die Bedeutung abstrakter Datentypen in der objektorientierten Programmierung. Klaus Kusche, September 2014

Die Bedeutung abstrakter Datentypen in der objektorientierten Programmierung. Klaus Kusche, September 2014 Die Bedeutung abstrakter Datentypen in der objektorientierten Programmierung Klaus Kusche, September 2014 Inhalt Ziel & Voraussetzungen Was sind abstrakte Datentypen? Was kann man damit grundsätzlich?

Mehr

Referent: Thomas Storch (FI für Anwendungsentwicklung, 1. Lj.) Vortrag: Apache Maven. Datum: 25.04.2012. Deutsche Software Engineering & Research GmbH

Referent: Thomas Storch (FI für Anwendungsentwicklung, 1. Lj.) Vortrag: Apache Maven. Datum: 25.04.2012. Deutsche Software Engineering & Research GmbH Referent: Thomas Storch (FI für Anwendungsentwicklung, 1. Lj.) Vortrag: Apache Maven Datum: 25.04.2012 Deutsche Software Engineering & Research GmbH Steinstraße 11 02826 Görlitz Germany Telefon: +49 35

Mehr

Java Schulung. Objektorientierte Programmierung in Java Teil IV: Testen mit JUnit. Prof. Dr. Nikolaus Wulff

Java Schulung. Objektorientierte Programmierung in Java Teil IV: Testen mit JUnit. Prof. Dr. Nikolaus Wulff Java Schulung Objektorientierte Programmierung in Java Teil IV: Testen mit JUnit Prof. Dr. Nikolaus Wulff JUnit JUnit ist das Opensource Testframework. Es existieren Portierungen für fast alle objektorientierten

Mehr

URT Eclipse All in one

URT Eclipse All in one URT Eclipse All in one Das Paket Eclipse All in one enthält Programme und Einstellungen, die zum Programmieren mit Eclipse in Zusammenarbeit mit Subversion und ANT benötigt werden. Dieses Paket dient als

Mehr

Application Frameworks

Application Frameworks Seminar Software Engineering 1 Grundlagen Agenda Spring Framework Dependency Injection Aspektorientierte Programmierung Datenbankanbindung Modell View Controller Sicherheit Spring vs. Java EE Zusammenfassung

Mehr

Konfigurationsmanagement

Konfigurationsmanagement Konfigurationsmanagement mit Maven 2 Michael Albrecht, Manfred Wolff Michael Albrecht ist Chefarchitekt bei der NEUSTA GmbH und seit 2002 mit der Entwicklung und der Architektur von Java EE Projekten beschäftigt.

Mehr

Anleitung zur Webservice Entwicklung unter Eclipse

Anleitung zur Webservice Entwicklung unter Eclipse Entwicklungsumgebung installieren Sofern Sie nicht an einem Praktikumsrechner arbeiten, müssen Sie ihre Eclipse-Umgebung Webservice-fähig machen. Dazu benötigen Sie die Entwicklungsumgebung Eclipse for

Mehr

MySQL Community Server 5.6 Installationsbeispiel (Ab 5.5.29)

MySQL Community Server 5.6 Installationsbeispiel (Ab 5.5.29) MySQL Community Server 5.6 Installationsbeispiel (Ab 5.5.29) Dieses Dokument beschreibt das Herunterladen der Serversoftware, die Installation und Konfiguration der Software. Bevor mit der Migration der

Mehr

3 Objektorientierte Konzepte in Java

3 Objektorientierte Konzepte in Java 3 Objektorientierte Konzepte in Java Bisherige Beobachtungen zu Objekten: werden in Klassen zusammengefasst besitzen Eigenschaften und Verhalten verbergen private Informationen werden geboren, leben und

Mehr

Nils Hartmann Gerd Wütherich. Build my bundle! oder: Es muss nicht immer PDE sein

Nils Hartmann Gerd Wütherich. Build my bundle! oder: Es muss nicht immer PDE sein Nils Hartmann Gerd Wütherich Build my bundle! oder: Es muss nicht immer PDE sein Inhalt» Theorie» Bauen von Software» Projekte, Projektbeschreibungen und Definition von Abhängigkeiten» Integration bestehender

Mehr

Schritt 4: Hallo Enterprise Bean

Schritt 4: Hallo Enterprise Bean Prof. Dr. Th. Letschert FB MNI JEE Schritt 4: Hallo Enterprise Bean Einstieg: EJBs erzeugen und nutzen Meine erstes EJB Projekt Enterprise Beans sind eine Backend Technologie, die mit unterschiedlichen

Mehr

Projekt Weblog :: Integration

Projekt Weblog :: Integration Projekt Weblog :: Integration Die Implementation des Formhandling Frameworks wird nun im Projekt Weblog integriert. Dafür stehen 2 Möglichkeiten zur Auswahl. Sie haben Ihre eigene Implementation der Actions,

Mehr

Musterlösung zur Vorlesung Modellbasierte Softwareentwicklung Wintersemester 2014/2015 Übungsblatt 9

Musterlösung zur Vorlesung Modellbasierte Softwareentwicklung Wintersemester 2014/2015 Übungsblatt 9 Prof. Dr. Wilhelm Schäfer Paderborn, 15. Dezember 2014 Christian Brenner Tristan Wittgen Musterlösung zur Vorlesung Modellbasierte Softwareentwicklung Wintersemester 2014/2015 Übungsblatt 9 Aufgabe 1 Codegenerierung

Mehr