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=" xmlns:xsi=" xsi:schemalocation=" \ <modelversion>4.0.0</modelversion> <groupid>com.sse.jregedit</groupid> <artifactid>jregedit</artifactid> <version>1.0</version> <packaging>jar</packaging> <name>jregedit</name> <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

Ü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

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

SANDBOXIE konfigurieren

SANDBOXIE konfigurieren SANDBOXIE konfigurieren für Webbrowser und E-Mail-Programme Dies ist eine kurze Anleitung für die grundlegenden folgender Programme: Webbrowser: Internet Explorer, Mozilla Firefox und Opera E-Mail-Programme:

Mehr

OP-LOG www.op-log.de

OP-LOG www.op-log.de Verwendung von Microsoft SQL Server, Seite 1/18 OP-LOG www.op-log.de Anleitung: Verwendung von Microsoft SQL Server 2005 Stand Mai 2010 1 Ich-lese-keine-Anleitungen 'Verwendung von Microsoft SQL Server

Mehr

Softwaretests in Visual Studio 2010 Ultimate Vergleich mit Java-Testwerkzeugen. Alexander Schunk Marcel Teuber Henry Trobisch

Softwaretests in Visual Studio 2010 Ultimate Vergleich mit Java-Testwerkzeugen. Alexander Schunk Marcel Teuber Henry Trobisch Softwaretests in Visual Studio 2010 Ultimate Vergleich mit Java-Testwerkzeugen Alexander Schunk Henry Trobisch Inhalt 1. Vergleich der Unit-Tests... 2 2. Vergleich der Codeabdeckungs-Tests... 2 3. Vergleich

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

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

Informationen zur Verwendung von Visual Studio und cmake

Informationen zur Verwendung von Visual Studio und cmake Inhaltsverzeichnis Informationen zur Verwendung von Visual Studio und cmake... 2 Erste Schritte mit Visual Studio... 2 Einstellungen für Visual Studio 2013... 2 Nutzung von cmake... 6 Installation von

Mehr

BSV Software Support Mobile Portal (SMP) Stand 1.0 20.03.2015

BSV Software Support Mobile Portal (SMP) Stand 1.0 20.03.2015 1 BSV Software Support Mobile Portal (SMP) Stand 1.0 20.03.2015 Installation Um den Support der BSV zu nutzen benötigen Sie die SMP-Software. Diese können Sie direkt unter der URL http://62.153.93.110/smp/smp.publish.html

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

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

Möglichkeiten des Parallelbetriebs der VR-NetWorld Software Parallelbetrieb VR-NetWorld Software 4.4x und Version 5.0 ab der 2. Beta!

Möglichkeiten des Parallelbetriebs der VR-NetWorld Software Parallelbetrieb VR-NetWorld Software 4.4x und Version 5.0 ab der 2. Beta! Möglichkeiten des Parallelbetriebs der VR-NetWorld Software Um mehrere Versionsstände parallel betreiben zu können, sollte man die folgenden Hintergründe kennen, um zu verstehen wo ggf. die Hürden liegen.

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

Über die Internetseite www.cadwork.de Hier werden unter Download/aktuelle Versionen die verschiedenen Module als zip-dateien bereitgestellt.

Über die Internetseite www.cadwork.de Hier werden unter Download/aktuelle Versionen die verschiedenen Module als zip-dateien bereitgestellt. Internet, Codes und Update ab Version 13 Um Ihnen einen möglichst schnellen Zugang zu den aktuellsten Programmversionen zu ermöglichen liegen Update-Dateien für Sie im Internet bereit. Es gibt drei Möglichkeiten

Mehr

Es sollte die MS-DOS Eingabeaufforderung starten. Geben Sie nun den Befehl javac ein.

Es sollte die MS-DOS Eingabeaufforderung starten. Geben Sie nun den Befehl javac ein. Schritt 1: Installation des Javacompilers JDK. Der erste Start mit Eclipse Bevor Sie den Java-Compiler installieren sollten Sie sich vergewissern, ob er eventuell schon installiert ist. Gehen sie wie folgt

Mehr

Auto-Provisionierung tiptel 30x0 mit Yeastar MyPBX

Auto-Provisionierung tiptel 30x0 mit Yeastar MyPBX Allgemeines Auto-Provisionierung tiptel 30x0 mit Yeastar MyPBX Stand 21.11.2014 Die Yeastar MyPBX Telefonanlagen unterstützen die automatische Konfiguration der tiptel 3010, tiptel 3020 und tiptel 3030

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

Meldung Lokale Anwendung inkompatibel oder Microsoft Silverlight ist nicht aktuell bei Anmeldung an lokal gespeicherter RWE SmartHome Anwendung

Meldung Lokale Anwendung inkompatibel oder Microsoft Silverlight ist nicht aktuell bei Anmeldung an lokal gespeicherter RWE SmartHome Anwendung Meldung Lokale Anwendung inkompatibel oder Microsoft Silverlight ist nicht aktuell bei Anmeldung an lokal gespeicherter RWE SmartHome Anwendung Nach dem Update auf die Version 1.70 bekommen Sie eine Fehlermeldung,

Mehr

Adminer: Installationsanleitung

Adminer: Installationsanleitung Adminer: Installationsanleitung phpmyadmin ist bei uns mit dem Kundenmenüpasswort geschützt. Wer einer dritten Person Zugriff auf die Datenbankverwaltung, aber nicht auf das Kundenmenü geben möchte, kann

Mehr

COSA. Portal Client Installation JAVA J2SE / JRE Version 1.4.2_09, Stand 01.08.2005-08-16. Copyright

COSA. Portal Client Installation JAVA J2SE / JRE Version 1.4.2_09, Stand 01.08.2005-08-16. Copyright Portal Client Installation JAVA J2SE / JRE Version 1.4.2_09, Stand 01.08.2005-08-16 Änderungen in Dokumentation und Software sind vorbehalten! Copyright Copyright 2005 COSA GmbH Alle Rechte vorbehalten.

Mehr

INSTALLATION VON INSTANTRAILS 1.7

INSTALLATION VON INSTANTRAILS 1.7 INSTALLATION VON INSTANTRAILS 1.7 InstantRails 1.7 ist ein Paket, das Ruby, Rails, Apache, MySQL und andere Tools, z.b. phpmyadmin in vorkonfigurierter Form enthält. Das Paket muss in einem Verzeichnis

Mehr

Live Update (Auto Update)

Live Update (Auto Update) Live Update (Auto Update) Mit der Version 44.20.00 wurde moveit@iss+ um die Funktion des Live Updates (in anderen Programmen auch als Auto Update bekannt) für Programm Updates erweitert. Damit Sie auch

Mehr

SafeRun-Modus: Die Sichere Umgebung für die Ausführung von Programmen

SafeRun-Modus: Die Sichere Umgebung für die Ausführung von Programmen SafeRun-Modus: Die Sichere Umgebung für die Ausführung von Programmen Um die maximale Sicherheit für das Betriebssystem und Ihre persönlichen Daten zu gewährleisten, können Sie Programme von Drittherstellern

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 von NetBeans inkl. Glassfish Anwendungs-Server

Installation von NetBeans inkl. Glassfish Anwendungs-Server Installation von NetBeans inkl. Glassfish Anwendungs-Server Diese Anleitung führt Sie Schritt für Schritt durch die Einrichtung der Entwicklungsumgebung NetBeans, angefangen beim Download der benötigten

Mehr

Version 0.3. Installation von MinGW und Eclipse CDT

Version 0.3. Installation von MinGW und Eclipse CDT Version 0.3 Installation von MinGW und Eclipse CDT 1. Stellen Sie fest, ob Sie Windows in der 32 Bit Version oder in der 64 Bit Version installiert haben. 2. Prüfen Sie, welche Java Runtime vorhanden ist.

Mehr

Universal Dashboard auf ewon Alarmübersicht auf ewon eigener HTML Seite.

Universal Dashboard auf ewon Alarmübersicht auf ewon eigener HTML Seite. ewon - Technical Note Nr. 003 Version 1.2 Universal Dashboard auf ewon Alarmübersicht auf ewon eigener HTML Seite. Übersicht 1. Thema 2. Benötigte Komponenten 3. Downloaden der Seiten und aufspielen auf

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

Komponententest. Testen von Software Systemen. Übung 02 SS 2009 Version: 1.0 09.06.2009

Komponententest. Testen von Software Systemen. Übung 02 SS 2009 Version: 1.0 09.06.2009 Testen von Software Systemen Übung 02 SS 2009 Version: 1.0 09.06.2009 Komponententest Kunde: Dr. Reinhold Plösch Dr. Johannes Sametinger Kundenreferenz: 259.019 Team 19 Mitarbeiter: Christian Märzinger

Mehr

Task: Nmap Skripte ausführen

Task: Nmap Skripte ausführen Task: Nmap Skripte ausführen Inhalt Einfache Netzwerkscans mit NSE Ausführen des Scans Anpassung der Parameter Einleitung Copyright 2009-2015 Greenbone Networks GmbH Herkunft und aktuellste Version dieses

Mehr

Nie wieder eine Sitzung verpassen unser neuer Service für Sie!

Nie wieder eine Sitzung verpassen unser neuer Service für Sie! Nie wieder eine Sitzung verpassen unser neuer Service für Sie! Bisher war es nicht immer leicht, den Überblick über die Ammersbeker Sitzungstermine zu behalten. Entweder man hat die Bekanntmachung übersehen

Mehr

Internet Explorer Version 6

Internet Explorer Version 6 Internet Explorer Version 6 Java Runtime Ist Java Runtime nicht installiert, öffnet sich ein PopUp-Fenster, welches auf das benötigte Plugin aufmerksam macht. Nach Klicken auf die OK-Taste im PopUp-Fenster

Mehr

Installation der SAS Foundation Software auf Windows

Installation der SAS Foundation Software auf Windows Installation der SAS Foundation Software auf Windows Der installierende Benutzer unter Windows muss Mitglied der lokalen Gruppe Administratoren / Administrators sein und damit das Recht besitzen, Software

Mehr

Qt-Projekte mit Visual Studio 2005

Qt-Projekte mit Visual Studio 2005 Qt-Projekte mit Visual Studio 2005 Benötigte Programme: Visual Studio 2005 Vollversion, Microsoft Qt 4 Open Source s. Qt 4-Installationsanleitung Tabelle 1: Benötigte Programme für die Qt-Programmierung

Mehr

25 Import der Beispiele

25 Import der Beispiele 25 Import der Beispiele Versuch es nicht mit Gewalt. Nimm einfach einen größeren Hammer (Murphy s Law) 25.1 Einleitung Alle Beispielprogramme dieses Buchs funktionieren mit jeder Java-konformen Entwicklungsumgebung.

Mehr

Wichtige Hinweise zu den neuen Orientierungshilfen der Architekten-/Objektplanerverträge

Wichtige Hinweise zu den neuen Orientierungshilfen der Architekten-/Objektplanerverträge Wichtige Hinweise zu den neuen Orientierungshilfen der Architekten-/Objektplanerverträge Ab der Version forma 5.5 handelt es sich bei den Orientierungshilfen der Architekten-/Objektplanerverträge nicht

Mehr

Kostenstellen verwalten. Tipps & Tricks

Kostenstellen verwalten. Tipps & Tricks Tipps & Tricks INHALT SEITE 1.1 Kostenstellen erstellen 3 13 1.3 Zugriffsberechtigungen überprüfen 30 2 1.1 Kostenstellen erstellen Mein Profil 3 1.1 Kostenstellen erstellen Kostenstelle(n) verwalten 4

Mehr

Anwenden eines Service Packs auf eine Workstation

Anwenden eines Service Packs auf eine Workstation Anwenden eines Service Packs auf EXTRA! 9.2 Stand vom 1. März 2012 Hinweis: Die neuesten Informationen werden zunächst im technischen Hinweis 2263 in englischer Sprache veröffentlicht. Wenn das Datum der

Mehr

Java Entwicklung für Embedded Devices Best & Worst Practices!

Java Entwicklung für Embedded Devices Best & Worst Practices! Java Entwicklung für Embedded Devices! George Mesesan Microdoc GmbH Natürlich können wir dieses neue log4j Bundle auch auf dem Device verwenden. Ist doch alles Java. Java Micro Edition (ME) Java Standard

Mehr

Um ein solches Dokument zu erzeugen, muss eine Serienbriefvorlage in Word erstellt werden, das auf die von BüroWARE erstellte Datei zugreift.

Um ein solches Dokument zu erzeugen, muss eine Serienbriefvorlage in Word erstellt werden, das auf die von BüroWARE erstellte Datei zugreift. Briefe Schreiben - Arbeiten mit Word-Steuerformaten Ab der Version 5.1 stellt die BüroWARE über die Word-Steuerformate eine einfache Methode dar, Briefe sowie Serienbriefe mit Hilfe der Korrespondenzverwaltung

Mehr

Step by Step Webserver unter Windows Server 2003. von Christian Bartl

Step by Step Webserver unter Windows Server 2003. von Christian Bartl Step by Step Webserver unter Windows Server 2003 von Webserver unter Windows Server 2003 Um den WWW-Server-Dienst IIS (Internet Information Service) zu nutzen muss dieser zunächst installiert werden (wird

Mehr

Diese Ansicht erhalten Sie nach der erfolgreichen Anmeldung bei Wordpress.

Diese Ansicht erhalten Sie nach der erfolgreichen Anmeldung bei Wordpress. Anmeldung http://www.ihredomain.de/wp-admin Dashboard Diese Ansicht erhalten Sie nach der erfolgreichen Anmeldung bei Wordpress. Das Dashboard gibt Ihnen eine kurze Übersicht, z.b. Anzahl der Beiträge,

Mehr

MULTIWEB Banking. Installation und Update unter Windows

MULTIWEB Banking. Installation und Update unter Windows MULTIWEB Banking Installation und Update unter Windows Handbuch Version: 1.0 CoCoNet GmbH Seite 1 von 7 MULTIWEB Banking Installation und Update unter Windows Handbuch Dieses Handbuch wurde mit äußerster

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

Die Dateiablage Der Weg zur Dateiablage

Die Dateiablage Der Weg zur Dateiablage Die Dateiablage In Ihrem Privatbereich haben Sie die Möglichkeit, Dateien verschiedener Formate abzulegen, zu sortieren, zu archivieren und in andere Dateiablagen der Plattform zu kopieren. In den Gruppen

Mehr

Windows 7 Winbuilder USB Stick

Windows 7 Winbuilder USB Stick Windows 7 Winbuilder USB Stick Benötigt wird das Programm: Winbuilder: http://www.mediafire.com/?qqch6hrqpbem8ha Windows 7 DVD Der Download wird in Form einer gepackten Datei (7z) angeboten. Extrahieren

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

Er musste so eingerichtet werden, dass das D-Laufwerk auf das E-Laufwerk gespiegelt

Er musste so eingerichtet werden, dass das D-Laufwerk auf das E-Laufwerk gespiegelt Inhaltsverzeichnis Aufgabe... 1 Allgemein... 1 Active Directory... 1 Konfiguration... 2 Benutzer erstellen... 3 Eigenes Verzeichnis erstellen... 3 Benutzerkonto erstellen... 3 Profil einrichten... 5 Berechtigungen

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

INSTALLATION DES V-MODELL XT UNTER WINDOWS VISTA

INSTALLATION DES V-MODELL XT UNTER WINDOWS VISTA INSTALLATION DES V-MODELL XT UNTER WINDOWS VISTA Unter Windows Vista ist die Installation der V-Modell XT Komponenten nicht ohne Weiteres möglich, da die User Account Control (UAC)-Engine dies unterbindet.

Mehr

Collax E-Mail Archive Howto

Collax E-Mail Archive Howto Collax E-Mail Archive Howto Howto Dieses Howto beschreibt wie ein Collax Server innerhalb weniger Schritte als E-Mail Archive eingerichtet werden kann, um Mitarbeitern Zugriff auf das eigene E-Mail Archiv

Mehr

Updateseite_BuV-PlugIn-NERZ-Gesamt

Updateseite_BuV-PlugIn-NERZ-Gesamt Autoren Dipl.-Ing. H. C. Kniß Dipl.-Math. L. Givorgizova Ersteller Geschäftsstelle NERZ e. V. Kölner Straße 30 D-50859 Köln Version: 5.0 Stand: 15.02.2013 Status: akzeptiert 1 Allgemeines 1.1 Änderungsübersicht

Mehr

Installation OMNIKEY 3121 USB

Installation OMNIKEY 3121 USB Installation OMNIKEY 3121 USB Vorbereitungen Installation PC/SC Treiber CT-API Treiber Einstellungen in Starke Praxis Testen des Kartenlesegeräts Vorbereitungen Bevor Sie Änderungen am System vornehmen,

Mehr

Installation der Konfigurationsdateien für alle Windows-Versionen bis einschließlich Microsoft Windows 7

Installation der Konfigurationsdateien für alle Windows-Versionen bis einschließlich Microsoft Windows 7 Installation der Konfigurationsdateien für alle Windows-Versionen bis einschließlich Microsoft Windows 7 Zur Arbeitserleichterung und für einen reibungslosen Übungsbetrieb ist es zwingend notwendig, sowohl

Mehr

Suche schlecht beschriftete Bilder mit Eigenen Abfragen

Suche schlecht beschriftete Bilder mit Eigenen Abfragen Suche schlecht beschriftete Bilder mit Eigenen Abfragen Ist die Bilderdatenbank über einen längeren Zeitraum in Benutzung, so steigt die Wahrscheinlichkeit für schlecht beschriftete Bilder 1. Insbesondere

Mehr

Wissenswertes über LiveUpdate

Wissenswertes über LiveUpdate Wissenswertes über LiveUpdate 1.1 LiveUpdate «LiveUpdate» ermöglicht den einfachen und sicheren Download der neuesten Hotfixes und Patches auf Ihren PC. Bei einer Netzinstallation muss das LiveUpdate immer

Mehr

Installation und Inbetriebnahme von Microsoft Visual C++ 2010 Express

Installation und Inbetriebnahme von Microsoft Visual C++ 2010 Express Howto Installation und Inbetriebnahme von Microsoft Visual C++ 2010 Express Peter Bitterlich Markus Langer 12. Oktober 2012 Zusammenfassung Dieses Dokument erklärt Schritt für Schritt die Installation

Mehr

Sie werden sehen, dass Sie für uns nur noch den direkten PDF-Export benötigen. Warum?

Sie werden sehen, dass Sie für uns nur noch den direkten PDF-Export benötigen. Warum? Leitfaden zur Druckdatenerstellung Inhalt: 1. Download und Installation der ECI-Profile 2. Farbeinstellungen der Adobe Creative Suite Bitte beachten! In diesem kleinen Leitfaden möchten wir auf die Druckdatenerstellung

Mehr

Hex Datei mit Atmel Studio 6 erstellen

Hex Datei mit Atmel Studio 6 erstellen Hex Datei mit Atmel Studio 6 erstellen Es werden generell keine Atmel Studio Dateien ins Repository geladen, da jeder seine Dateien an anderen Orten liegen hat und weil nicht jeder das Atmel Studio 6 benutzt.

Mehr

Upgrade auf die Standalone Editionen von Acronis Backup & Recovery 10. Technische Informationen (White Paper)

Upgrade auf die Standalone Editionen von Acronis Backup & Recovery 10. Technische Informationen (White Paper) Upgrade auf die Standalone Editionen von Acronis Backup & Recovery 10 Technische Informationen (White Paper) Inhaltsverzeichnis 1. Über dieses Dokument... 3 2. Überblick... 3 3. Upgrade Verfahren... 4

Mehr

2. ERSTELLEN VON APPS MIT DEM ADT PLUGIN VON ECLIPSE

2. ERSTELLEN VON APPS MIT DEM ADT PLUGIN VON ECLIPSE 2. ERSTELLEN VON APPS MIT DEM ADT PLUGIN VON ECLIPSE 2.1 Die Einrichtung der Benutzeroberfläche Das Einrichten einer Android-Eclipse-Entwicklungsumgebung zur Android-Entwicklung ist grundsätzlich nicht

Mehr

DOKUMENTATION VOGELZUCHT 2015 PLUS

DOKUMENTATION VOGELZUCHT 2015 PLUS DOKUMENTATION VOGELZUCHT 2015 PLUS Vogelzucht2015 App für Geräte mit Android Betriebssystemen Läuft nur in Zusammenhang mit einer Vollversion vogelzucht2015 auf einem PC. Zusammenfassung: a. Mit der APP

Mehr

INHALT 1. INSTALLATION DES V-MODELL XT UNTER WINDOWS 7 2. INSTALLATION DES V-MODELL XT UNTER WINDOWS VISTA

INHALT 1. INSTALLATION DES V-MODELL XT UNTER WINDOWS 7 2. INSTALLATION DES V-MODELL XT UNTER WINDOWS VISTA INHALT 1. INSTALLATION DES V-MODELL XT UNTER WINDOWS 7 2. INSTALLATION DES V-MODELL XT UNTER WINDOWS VISTA 1. INSTALLATION DES V-MODELL XT UNTER WINDOWS 7 VORBEDINGUNGEN Als Vorbedingungen sollte bereits

Mehr

Installationsanleitungen

Installationsanleitungen Installationsanleitungen INPA SGBD-Entwicklungsumgebung (EDIABAS) INPA für Entwickler Bevor Sie EDIABAS / INPA installieren können, müssen Sie sich für den Ordner sgref auf smuc0900 freischalten lassen.

Mehr

Daten-Synchronisation zwischen Mozilla Thunderbird (Lightning) / Mozilla Sunbird und dem ZDV Webmailer

Daten-Synchronisation zwischen Mozilla Thunderbird (Lightning) / Mozilla Sunbird und dem ZDV Webmailer Daten-Synchronisation zwischen Mozilla Thunderbird (Lightning) / Mozilla Sunbird und dem ZDV Webmailer Zentrum für Datenverarbeitung der Universität Tübingen Inhaltsverzeichnis 1.Synchronisation...aber

Mehr

Python Installation. 1 Vorbereitung. 1.1 Download. Diese Anleitung ist für Windows ausgelegt.

Python Installation. 1 Vorbereitung. 1.1 Download. Diese Anleitung ist für Windows ausgelegt. Python Installation 1 Vorbereitung Diese Anleitung ist für Windows ausgelegt. 1.1 Download Python kann online unter https://www.python.org/downloads/ heruntergeladen werden. Hinweis: Im CoderDojo verwenden

Mehr

.NET Code schützen. Projekt.NET. Version 1.0

.NET Code schützen. Projekt.NET. Version 1.0 .NET Code schützen Projekt.NET Informationsmaterial zum Schützen des.net Codes Version 1.0 Autor: Status: Ablage: Empfänger: Seiten: D. Hoyer 1 / 6 Verteiler : Dokument1 Seite 1 von 1 Änderungsprotokoll

Mehr

TechNote. Produkt: TWINFAX 7.0 (ab CD_24), TWINFAX 6.0 Modul: SMTP, T611, R3 Kurzbeschreibung: Briefpapier- und Mailbodyunterstützung

TechNote. Produkt: TWINFAX 7.0 (ab CD_24), TWINFAX 6.0 Modul: SMTP, T611, R3 Kurzbeschreibung: Briefpapier- und Mailbodyunterstützung Produkt: TWINFAX 7.0 (ab CD_24), TWINFAX 6.0 Modul: SMTP, T611, R3 Kurzbeschreibung: Briefpapier- und Mailbodyunterstützung Diese Anleitung hilft Ihnen, das nachfolgend geschilderte Problem zu beheben.

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

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

Artikel Schnittstelle über CSV

Artikel Schnittstelle über CSV Artikel Schnittstelle über CSV Sie können Artikeldaten aus Ihrem EDV System in das NCFOX importieren, dies geschieht durch eine CSV Schnittstelle. Dies hat mehrere Vorteile: Zeitersparnis, die Karteikarte

Mehr

Facebook I-Frame Tabs mit Papoo Plugin erstellen und verwalten

Facebook I-Frame Tabs mit Papoo Plugin erstellen und verwalten Facebook I-Frame Tabs mit Papoo Plugin erstellen und verwalten Seit Anfang Juni 2012 hat Facebook die Static FBML Reiter deaktiviert, so wird es relativ schwierig für Firmenseiten eigene Impressumsreiter

Mehr

ecaros-update 8.2 Update 8.2 procar informatik AG 1 Stand: DP 02/2014 Eschenweg 7 64331 Weiterstadt

ecaros-update 8.2 Update 8.2 procar informatik AG 1 Stand: DP 02/2014 Eschenweg 7 64331 Weiterstadt Update 8.2 procar informatik AG 1 Stand: DP 02/2014 Inhaltsverzeichnis 1 Allgemein... 3 2 Erforderliche Anpassungen bei der Installation...3 2.1 Konfiguration Jboss 7 Applicationserver (Schritt 4/10)...3

Mehr

MailUtilities: Remote Deployment - Einführung

MailUtilities: Remote Deployment - Einführung MailUtilities: Remote Deployment - Einführung Zielsetzung Die Aufgabe von Remote Deployment adressiert zwei Szenarien: 1. Konfiguration der MailUtilities von einer Workstation aus, damit man das Control

Mehr

Collax E-Mail-Archivierung

Collax E-Mail-Archivierung Collax E-Mail-Archivierung Howto Diese Howto beschreibt wie die E-Mail-Archivierung auf einem Collax Server installiert und auf die Daten im Archiv zugegriffen wird. Voraussetzungen Collax Business Server

Mehr

WOT Skinsetter. Nun, erstens, was brauchen Sie für dieses Tool zu arbeiten:

WOT Skinsetter. Nun, erstens, was brauchen Sie für dieses Tool zu arbeiten: WOT Skinsetter WOT Skinsetter steht für World of Tanks skinsetter (WOTS von nun an). Mit diesen Tool können Sie Skins importieren und ändern, wann immer Sie möchten auf einfache Weise. Als World of Tanks

Mehr

Backup der Progress Datenbank

Backup der Progress Datenbank Backup der Progress Datenbank Zeitplandienst (AT): Beachten Sie bitte: Die folgenden Aktionen können nur direkt am Server, vollzogen werden. Mit Progress 9.1 gibt es keine Möglichkeit über die Clients,

Mehr

Konfiguration von Igel ThinClients fu r den Zugriff via Netscaler Gateway auf eine Storefront/ XenDesktop 7 Umgebung

Konfiguration von Igel ThinClients fu r den Zugriff via Netscaler Gateway auf eine Storefront/ XenDesktop 7 Umgebung Konfiguration von Igel ThinClients fu r den Zugriff via Netscaler Gateway auf eine Storefront/ XenDesktop 7 Umgebung Inhalt 1. Einleitung:... 2 2. Igel ThinClient Linux OS und Zugriff aus dem LAN... 3

Mehr

1 Installation QTrans V2.0 unter Windows NT4

1 Installation QTrans V2.0 unter Windows NT4 1 Installation QTrans V2.0 unter Windows NT4 1.1 Unterstützte Funktionen Unter NT4 wird nur der Betrieb von QTrans im Report-Client-Modus unterstützt, d. h. für die Anzeige von Schraubergebnissen und für

Mehr

INSTALLATIONSANLEITUNG

INSTALLATIONSANLEITUNG INSTALLATIONSANLEITUNG MASTER UPDATE 2.1.0.4 2014 Gambio GmbH. www.gambio.de Inhaltsverzeichnis 1 Changelog 3 2 Datensicherung 3 3 Installation Master Update 4 3.1 Update von Shopsystemen v2.0.7c bis v2.0.15.4

Mehr

Wählen Sie bitte START EINSTELLUNGEN SYSTEMSTEUERUNG VERWALTUNG und Sie erhalten unter Windows 2000 die folgende Darstellung:

Wählen Sie bitte START EINSTELLUNGEN SYSTEMSTEUERUNG VERWALTUNG und Sie erhalten unter Windows 2000 die folgende Darstellung: Installation Bevor Sie mit der Installation von MOVIDO 1.0 beginnen, sollten Sie sich vergewissern, dass der Internet Information Server (IIS) von Microsoft installiert ist. Um dies festzustellen, führen

Mehr

Innovator 11 classix. Anbindung an Eclipse. Einführung, Installation und Konfiguration. Connect. Michael Kaaden. www.mid.de

Innovator 11 classix. Anbindung an Eclipse. Einführung, Installation und Konfiguration. Connect. Michael Kaaden. www.mid.de Innovator 11 classix Anbindung an Eclipse Einführung, Installation und Konfiguration Michael Kaaden Connect www.mid.de Einführung in die Innovator-Eclipse-Anbindung Die hier beschriebene Anbindung steht

Mehr

Robot Karol für Delphi

Robot Karol für Delphi Robot Karol für Delphi Reinhard Nitzsche, OSZ Handel I Version 0.1 vom 24. Januar 2003 Zusammenfassung Nach der Einführung in die (variablenfreie) Programmierung mit Robot Karol von Freiberger und Krško

Mehr

Für Windows 7 Stand: 21.01.2013

Für Windows 7 Stand: 21.01.2013 Für Windows 7 Stand: 21.01.2013 1 Überblick Alle F.A.S.T. Messgeräte verfügen über dieselbe USB-Seriell Hardware, welche einen Com- Port zur Kommunikation im System zur Verfügung stellt. Daher kann bei

Mehr

MetaQuotes Empfehlungen zum Gebrauch von

MetaQuotes Empfehlungen zum Gebrauch von MetaQuotes Empfehlungen zum Gebrauch von MetaTrader 4 auf Mac OS Auch wenn viele kommerzielle Angebote im Internet existieren, so hat sich MetaQuotes, der Entwickler von MetaTrader 4, dazu entschieden

Mehr

Support-Tipp Mai 2010 - Release Management in Altium Designer

Support-Tipp Mai 2010 - Release Management in Altium Designer Support-Tipp Mai 2010 - Release Management in Altium Designer Mai 2010 Frage: Welche Aufgaben hat das Release Management und wie unterstützt Altium Designer diesen Prozess? Zusammenfassung: Das Glück eines

Mehr

Seite 1 von 14. Cookie-Einstellungen verschiedener Browser

Seite 1 von 14. Cookie-Einstellungen verschiedener Browser Seite 1 von 14 Cookie-Einstellungen verschiedener Browser Cookie-Einstellungen verschiedener Browser, 7. Dezember 2015 Inhaltsverzeichnis 1.Aktivierung von Cookies... 3 2.Cookies... 3 2.1.Wofu r braucht

Mehr

Schrittweise Anleitung zur Installation von Zertifikaten der Bayerischen Versorgungskammer im Mozilla Firefox ab Version 2.0

Schrittweise Anleitung zur Installation von Zertifikaten der Bayerischen Versorgungskammer im Mozilla Firefox ab Version 2.0 Schrittweise Anleitung zur Installation von Zertifikaten der Bayerischen Versorgungskammer im Mozilla Firefox ab Version 2.0 Diese Anleitung führt Sie Schritt für Schritt durch die komplette Installationsprozedur

Mehr

HSR git und subversion HowTo

HSR git und subversion HowTo HSR git und subversion HowTo An der HSR steht den Studierenden ein git Server für die Versionskontrolle zur Verfügung. Dieses HowTo fasst die notwendigen Informationen zur Verwendung dieses Dienstes zusammen.

Mehr

Stand: 26.09.2012. Dokumentenverwaltung Modulbeschreibung

Stand: 26.09.2012. Dokumentenverwaltung Modulbeschreibung Seite 1 Inhalt Allgemein...3 Installation...3 So nutzen Sie die...4 Dokumente an andere INKS-Benutzer melden...7 Dokumentenliste ausdrucken...9 Konfiguration der... 10 Seite 2 Allgemein Die bietet Ihnen

Mehr

LEHRSTUHL FÜR DATENBANKEN

LEHRSTUHL FÜR DATENBANKEN LEHRSTUHL FÜR DATENBANKEN Informatik II für Verkehrsingenieure Java & Eclipse Installationsguide Prof. Dr.-Ing. Wolfgang Lehner > Was ist Eclipse? Eine sogenannte Integrierte Entwicklungsumgebung (engl.

Mehr

Dieses Dokument beschreibt die Installation des Governikus Add-In for Microsoft Office (Governikus Add-In) auf Ihrem Arbeitsplatz.

Dieses Dokument beschreibt die Installation des Governikus Add-In for Microsoft Office (Governikus Add-In) auf Ihrem Arbeitsplatz. IInsttallllattiionslleiittffaden Dieses Dokument beschreibt die Installation des Governikus Add-In for Microsoft Office (Governikus Add-In) auf Ihrem Arbeitsplatz. Voraussetzungen Für die Installation

Mehr

Installation von Updates

Installation von Updates Installation von Updates In unregelmässigen Abständen erscheinen Aktualisierungen zu WinCard Pro, entweder weil kleinere Verbesserungen realisiert bzw. Fehler der bestehenden Version behoben wurden (neues

Mehr

Speichern. Speichern unter

Speichern. Speichern unter Speichern Speichern unter Speichern Auf einem PC wird ständig gespeichert. Von der Festplatte in den Arbeitspeicher und zurück Beim Download Beim Kopieren Beim Aufruf eines Programms Beim Löschen Beim

Mehr

Java: Vererbung. Teil 3: super() www.informatikzentrale.de

Java: Vererbung. Teil 3: super() www.informatikzentrale.de Java: Vererbung Teil 3: super() Konstruktor und Vererbung Kindklasse ruft SELBSTSTÄNDIG und IMMER zuerst den Konstruktor der Elternklasse auf! Konstruktor und Vererbung Kindklasse ruft SELBSTSTÄNDIG und

Mehr

Installation und Sicherung von AdmiCash mit airbackup

Installation und Sicherung von AdmiCash mit airbackup Installation und Sicherung von AdmiCash mit airbackup airbackup airbackup ist eine komfortable, externe Datensicherungslösung, welche verschiedene Funktionen zur Sicherung, sowie im Falle eines Datenverlustes,

Mehr