SlideShare une entreprise Scribd logo
1  sur  222
Schulung

„Ant im Detail“
© 2008 - 2009 Jörn Dinkla

    joern@dinkla.com

 http://www.dinkla.com

     © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com
Vorstellung
•   Dipl.-Inform. Jörn Dinkla
•   Schwerpunkte
     • Java Entwicklung (J2SE, JEE)
     • Moderne Programmiersprachen
         • Groovy, Ruby, Haskell, Scala
     • Modellgetriebene Entwicklung
     • Automatisierung
     • Eclipse-Plugin-Entwicklung
     • CUDA, OpenCL
     • Business-Intelligence
•   Hobbies
     • Musik, Literatur

                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   2
Überblick



© 2008 - 2009 Jörn Dinkla, http://www.dinkla.com
Überblick
•   Einführung und Kennenlernen
•   Überblick über Build-Prozesse
•   Ant-Grundkurs
     • Java-Projekt zum Kennenlernen
     • Ant auf der Kommandozeile
•   Die Datentypen von Ant
•   Die Tasks von Ant
•   Ant und IDEs
•   Ant erweitern

•   Zwischendurch
     • Hands-on
     • Gemeinsam mit Ant entwickeln
                      © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   4
Build-Prozesse und -Tools



        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com
Was ist ein Build-Prozess ?
•   Von den Artifakten zum installierten Produkt
•   Graph mit Abhängigkeiten (DAG)
•   Workflow

    UML                     Java

    XML    Generieren       JSP               Kompilieren
    ...                       ...
                                                                           Fehler-
                                                   Testen
                                                                           Reports


    Ausführen     Installieren                     Packen


                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com             6
Automatisierung von Build-Prozessen
•   Warum ?
     • Zeitersparnis
     • Es gibt bessere Dinge zu tun
     • Sicherheit, da manuelle Ausführung fehleranfällig ist
          • „Durch Langeweile entstehen Fehler“
•   Welche Prozesse ?
     • Daumenregel: Wenn mehr als zweimal durchgeführt
     • Und man diese genau genug kennt
•   Welche Arten ?
     • befehlsgesteuert
     • zeitgesteuert
     • ereignisgesteuert
                         © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   7
Automatisierung von Build-Prozessen
•   Wann ?
     • hängt vom Prozess und der Situation ab
           • Zeitdauer
           • die benötigten Ressourcen
     •   Sollten so oft wie möglich laufen

•   Was wird benötigt ?
     • Versionsverwaltung
     • Automatisierte Tests
     • Skripte (Installation, etc.)
     • Rückmeldung
           • Email, Web-Seiten, Lavalampen

                          © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   8
Das Ideal: CRISP
•   CRISP-Builds
     • vollständig („complete“)
           • von Grund auf neu erstellt
           • keine manuell hinzugefügten Dateien
     •   wiederholbar („repeatable“)
           • durch Versionskontrolle jederzeit konsistent
     •   informativ („informative“)
           • Gesundheitszustand der Software, Tests
     •   planbar („schedulable“)
           • Rund um die Uhr lauffähig -> frühe Fehlerentdeckung
     •   portable („portable“)
           • Keine Abhängigkeiten an speziellen Rechner

                           © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   9
Build-Tools
•   Sind „Programmiersprachen“ für
     • die Erstellung
     • und die Ausführung von Build-Prozessen

•   Die bekanntesten sind
     • Make
           • sehr alt (1977, Bell Labs)
           • sehr viele Varianten
     •   Ant
     •   Maven
     •   MSBuild (VisualStudio)
           • nur Windows

                           © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   10
Make
•   Tool aus der Unix-Welt
•   Ursprünglich für die Entwicklung in C
•   Transformationen von Dateien mit externen Programmen
     • Daher plattformabhängig
     • Tab‘s an bestimmten Stellen notwendig
•   Hier ein Ausschnitt aus dem Manual von GNUmake
     • „generiert aus *.c Datei ein Makefile *.d“
%.d: %.c
 @set -e; rm -f $@; 
 $(CC) -M $(CPPFLAGS) $< > $@.$$$$; 
 sed 's,($*).o[ :]*,1.o $@ : ,g' < $@.$$$$ > $@;
 rm -f $@.$$$$
•   siehe http://www.gnu.org/software/make/manual/
    make.html
                       © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   11
Maven
•   Ist wie Ant ein Apache-Projekt
•   „Project management and comprehension tool“
      • „comprehension“ = Begreifen, Erfassen, Verstehen
•   Maven bietet
      • Einheitliches Build-System
      • Informations-Infrastruktur
          • Bibliotheken, Test-Reports, Abhängigkeiten
     • Richtlinien für „Best Practices“
•   Maven erfordert
     • Einhaltung der „Best practices“ und Projektstruktur
     • Bei Abweichungen ist viel Arbeit notwendig
     • Übergang von „Benutzer von Maven“ zu „Plugin-
       Maintainer“ kann hart und zeitintensiv sein
                         © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   12
Ant
•   Apache Ant (http://ant.apache.org/)
•   Quasi-Standard in der Java-Welt
•   Basiert auf abstrakter Sicht
     • Targets, deren Abhängigkeiten
     • und Tasks
•   Pluspunkte
     • Einfach erweiterbar
     • Performant
     • Lebendige Community, Open Source
          • viele Erweiterungen
     • Testing integriert
     • in viele Entwicklungsumgebungen integriert
                       © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   13
Möglichkeiten mit Ant
•   Grundsatz: „Alles, was auf der JVM läuft, läuft mit Ant.“
•   Vielzahl an Möglichkeiten mit Ant
     • Archive
     • Datenbanken
     • Dateien
     • Java
     • Netzwerk
     • Prozesse
     • Softwareentwicklung
     • Testing
     • Versionsverwaltung
     • XML

                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   14
Möglichkeiten: Archive
•   Ant kann folgende Formate erstellen und lesen
     • Zip
     • Tar
     • Jar, War, Ear
     • Rpm
     • Cab (Microsoft)
•   Komprimierungsverfahren
     • Gzip
     • Bzip2
•   Jars können signiert werden



                       © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   15
Möglichkeiten: Dateien
•   Operationen für Dateien und Verzeichnisse
     • Anlegen, Löschen, Kopieren, Bewegen, Umbenennen,
       Konkatenieren
     • Transformieren
           • String-Ersetzungen
           • Ersetzung mit regulären Ausdrücken
     •   Komprimieren
     •   Checksummen, z. B. MD5
     •   Zugriffsrechte, Benutzer und Gruppen
     •   Patch




                          © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   16
Möglichkeiten: Java
•   Kompilieren
     • Sun, Jikes, MS, Kopi, GCJ, Symantec
•   Jar, War und Ear-Archive erstellen
     • inkl. Erstellung von MANIFEST.MF
•   Java-Klassen ausführen
•   JUnit-Tests durchführen
     • HTML-Reports erstellen
•   Javadoc erzeugen
•   Verschiedenes
     • Dependencies (JDepend)
     • Apt (Annotation Processor Tool)
     • Rmic (Java RMI stub compiler)
                       © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   17
Möglichkeiten: Netzwerk
•   Ant kann die meisten Netzwerkprotokolle.
     • Zugriff auf Sockets
     • FTP
     • HTML Get, Post
           • Testen: HTML-Clients für JUnit
     •   Email
     •   scp
     •   Prozesse mit ssh ausführen
     •   Rexec (remote execution)
     •   Telnet
     •   WebDAV



                          © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   18
Möglichkeiten: Softwareentwicklung
•   Support für „Skriptsprachen“
     • JavaScript, AWK, Groovy, Haskell, Python, Ruby,
       Scheme, Tcl, BeanShell, JLog, NetRexx, Scala, XSLT
       und viele mehr
•   Parsergeneratoren
     • ANTLR, JavaCC
•   Code-Qualität
     • Checkstyle, PMD, Findbugs, JavaNCSS
•   Generierung
     • XDoclet
•   J(2)EE
     • verschiedene Applikationsserver, Apache Tomcat
     • EJB2
                       © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   19
Möglichkeiten: Testing
•   Allgemein
     • JUnit („ist integriert“), 3.8 vs. 4.0
     • Cobertura (Testabdeckung)
     • JMeter (Performance und Lasttest)
     • TestNG, Fitnesse
•   Datenbank
     • DbUnit (Datenbank)
•   Applikation Server
     • JUnitEE
     • Apache Cactus
•   Web
     • HtmlUnit, HttpUnit, Canoo Web Test
•   XMLUnit
                         © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   20
Möglichkeiten: Prozesse
•   Prozesskontrolle
     • Externe Prozesse
           • Aufruf von Shell-Kommandos
           • Mächtig, aber nicht platformunabhängig
     •   Java-Klassen ausführen
           • können Ant-Prozess überdauern
•   Ant-Build-Prozesse
     • Aufruf von anderen Ant-Build-Skripts
     • Import von Definitionen




                          © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   21
Möglichkeiten: Verschiedenes
•   Datenbanken
     • Die Anbindung erfolgt über JDBC
     • SQL Statements absetzen

•   Management von Java-Bibliotheken
     • Ivy
         • Funktionalität ähnlich Maven




                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   22
Möglichkeiten: Versionsverwaltung
•   Versionsverwaltungen
     • CVS
     • Subversion (SVN)
     • ClearCase™
     • Continuus™
     • Perforce™
     • PVCS™
     • StarTeam™
     • VisualSourceSafe™

•   CVS und Subversion sind Open Source.


                     © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   23
Möglichkeiten: XML
•   XML
     • XML Dateien erstellen
     • XML-Dateien transformieren
           • XSLT
     •   Validierung
           • Nach DTD
           • Nach XML-Schema




                       © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   24
Ant-Grundlagen



   © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com
Apache Ant

 •   Ant-Dateien sind in XML geschrieben.
 •   Default: build.xml.

 
 <?xml version="1.0"?>
 
 <project name="Tutorial"                                              Projekt
            default="build">
                                                                          Target
 
    <target name="build">
 
      <echo message="Hallo Welt!" />                                      Task
        <echo message="Hallo, nochmal" />
 
    </target>
                                                                            Task
 
 </project>



                      © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com             26
Erinnerung: XML

 •   XML
      • Elemente („tags“) und Attribute
      • Starttags und Endtags, verkürzter Endtag ‚/>‘
      • Hierarchie mit Baumstruktur
      • DOM „document object model“
 •   <project name="Tutorial" default="build">
 
    <target name="build">
 
      <echo message="Hallo Welt!" />
        <echo message="Hallo, nochmal" />
 
    </target>
 
 </project>
                                                   Elemente               Attribute

                       © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com               27
Erinnerung: XML-Baumstruktur
•   <project name="Tutorial" default="build">

    <target name="build">

      <echo message="Hallo Welt!" />
       <echo message="Hallo, nochmal" />

    </target>

 </project>                   project
                            name=“Tutorial
                                  “

                                 target
                               name=“build

              echo                                                 echo
       message=“Hallo, Welt“                                  message=“Hallo,
                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com        28
Ausführen des Beispiels
• Ausführen des Skripts.
• -f gibt den Dateinamen an, Default ist: build.xml




•   Informationen:
      • Build-Datei, Targets, Tasks („[echo]“), Status, Dauer
                         © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   29
Aufbau
•   In einem Build-File befindet sich ein Projekt
      • Projekte können andere Projekte importieren
•   Ein Projekt besteht aus Targets
      • Targets können voneinander abhängig sein
•   Ein Target besteht aus Tasks
      • Sequentielle oder parallele Abarbeitung
•   Ein Task wird in einer Java-Klasse implementiert.
      • deshalb ist Ant erweiterbar
      • „dynamic XML binding“



                       © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   30
Beispiel für Aufbau

 <?xml version="1.0"?>

 <project name="Tutorial" default="all">                                    Projekt

    <target name="hallo">
                                                                              Target

      <echo message="Hallo Welt!" />

    </target>                                                                  Task

    <target name="ende">
                                                                              Target

      <echo message="Ende Welt!" />

    </target>                                                                  Task

    <target name="all"
             depends="hallo, ende" />                                         Target

 </project>
•   Attribut default definiert Default-Target
•   Attribut depends definiert Abhängigkeiten
                          © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com             31
Abhängigkeiten
•   Targets können als Argument übergeben werden




                     © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   32
Abhängigkeiten und Ausführung
•   Abhängigkeiten sind transitiv
     • Wenn a von b abhängt und b von c,
           • dann hängt a auch von c ab.
     •   a ← b und b ← c, dann a ← c

•   Die Bestimmung der Reihenfolge
     • geschieht einmalig am Anfang
     • topologische Sortierung eines DAGs




                          © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   33
Abhängigkeiten visualisieren
•   Abhängigkeiten können komplex werden
•   Tools, um Ant-Projektdateien zu visualisieren
     • Nicht editieren!
     • Linguine Maps




     •   yEd




                       © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   34
Komplexe Abhängigkeiten
•   Abhängigkeiten können komplex werden.
•   Siehe die Build-Datei von Hibernate 3.0




                      © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   35
Beispiel für Abhängigkeiten
    <target name="a">
        <echo>a</echo></target>
    <target name="b" depends="a">
        <echo>b</echo></target>
    <target name="c1" depends="b">
        <echo>c1</echo></target>
    <target name="c2" depends="a,b">
        <echo>c2</echo></target>
    <target name="c3" depends="b,a">
        <echo>c3</echo></target>
    <target name="d" depends="c2,c1,c3">

   
   <echo>d</echo></target>



                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   36
Beispiel für Abhängigkeiten
•   $ ant c1
•   ➙ a, b, c1
•   $ ant c2
•   ➙ a, b, c2
•   $ ant c3
•   ➙ a, b, c3
•   $ ant d
•   ➙ a, b, c2, c1, c3, d

•   Aber bei mehreren Targets:
     • $ ant b a
     • ➙ a, b, a
                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   37
Mehr als ein Target als Argument
•   Bei mehreren Targets auf der
    Kommandozeile aufpassen !




                       © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   38
Abhängigkeiten und Ausführung
•   Aus historischen Gründen (Kompatibilität)
     • Mehrere Targets auf der Kommandozeile werden einzeln
       ausgeführt
     • Deshalb ruft
         •$ ant b a
     • zuerst b auf (erstes Argument)
           • Dieses hängt von a ab.
           • Daher wird a aufgerufen.
           • Dann wird b ausgeführt.
     •   Dann kommt das zweite Argument a.
           • Daher wird a noch einmal aufgerufen.
     •   Sequenz: a, b, a

                            © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   39
Ant Grundkurs - Beispiel



       © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com
Eine Beispielanwendung
•   Sehr, sehr einfache Version des „Doktors“ des Emacs-
    Editors
•   Gibt nur einen zufälligen String zurück




                       © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   41
Verzeichnisstruktur
•   Die Projektstruktur
     • build.xml in der Wurzel
     • Sourcen in src
     • Tests in test
     • Bibliotheken in lib
     • Klassen in build/classes
     • Jar in build
     • Distribution in dist




                     © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   42
Der Build-Prozess
•   Build-Prozess für einfaches Java-Projekt.
•   Targets
     • Clean zum Saubermachen
     • Init
     • Compile
     • Execute
     • JUnit
     • Jar
     • Dokumentation mit Javadoc
     • Packeterstellung mit zip
     • Deployment mit Ftp


                       © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   43
Verzeichnisse anlegen und löschen
•   Verzeichnisse können mit mkdir angelegt werden.
<project name="project" default="compile">
  <target name="init">
    <mkdir dir="build"/>
    <mkdir dir="build/classes"/>
  </target>

•   Mit delete können sie wieder entfernt werden.

  <target name="clean">
    <delete dir="build"/>
  </target>
</project>


                       © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   44
Java kompilieren
•   Mit javac können Java-Dateien kompiliert werden.

    <target name="compile" depends="init">
       <javac srcdir="src" destdir="build/classes"/>
     </target>

•   Das Attribut srcdir gibt das Quellverzeichnis an.
     • Alle *.java Dateien werden kompiliert
     • Auch in Unterverzeichnissen
•   Das Attribut destdir gibt das Ziel für die *.class Dateien
    an.
•   Das build-Verzeichnis wird benötigt.
     • Deshalb abhängig von init.
                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   45
Java ausführen
•   Zum Testen einfacher Anwendungen nützlich

•   <target name="execute" depends="compile">
      <java classname="beispiel.Doctor"
            classpath="build/classes"/>
    </target>

•   Target ist abhängig von der Kompilierung
•   Das Attribut classname bestimmt die Klasse, deren main()-
    Methode aufgerufen wird.
•   Das Klassenpfad wird mit classpath bestimmt.



                       © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   46
Im Überblick
<project name="project" default="compile">
  <target name="clean">
    <delete dir="build"/>                   Säubern
  </target>
  <target name="init" depends="clean" >
    <mkdir dir="build"/>
                                          Verzeichnisse
    <mkdir dir="build/classes"/>
  </target>
  <target name="compile" depends="init"> Kompilieren
    <javac srcdir="src" destdir="build/classes"/>
  </target>
  <target name="execute" depends="compile">
    <java classname="beispiel.Doctor"
          classpath="build/classes"/>      Ausführen
  </target>
                    © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   47
Redundanzen und DRY
<project name="project" default="compile">
  <target name="clean">
    <delete dir="build"/>
  </target>
  <target name="init" depends="clean" >
    <mkdir dir="build"/>
    <mkdir dir="build/classes"/>
  </target>
  <target name="compile" depends="init">
    <javac srcdir="src" destdir="build/classes"/>
  </target>
  <target name="execute" depends="compile">
    <java classname="beispiel.Doctor"
          classpath="build/classes"/>
  </target>
                  © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   48
Lösung: Properties
<property name="build.dir" location="build"/>
<property name="classes.dir" value="build/classes"/>
  <target name="clean">
    <delete dir="${build.dir}"/>
  </target>
  <target name="init">
    <mkdir dir="${build.dir}"/>
    <mkdir dir="${classes.dir}"/>
  </target>
  <target name="compile" depends="init">
    <javac srcdir="src" destdir="${classes.dir}"/>
  </target>
  <target name="execute" depends="compile">
    <java classname="beispiel.Doctor"
          classpath="${classes.dir}"/>
  </target>



                       © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   49
Properties
<property name="build.dir" location="build"/>
<property name="classes.dir" value="build/classes"/>
•   location ermittelt die vollen Pfadnamen
•   Bei value wird der Wert selbst genommen
•   Properties sind Konstanten
     • Einmal gesetzt, ändern sie sich nicht mehr
     • Ermöglich Steuerung des Skripts von außen
     •$    ant -f build1.xml -Dbuild.dir=bauverzeichnis
     •   Erstellt die Dateien im Verzeichnis bauverzeichnis
•   Properties können auch aus Property-Dateien gelesen
    werden

•   ... später mehr dazu ...
                          © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   50
JUnit-Tests
•   Wir müssen jetzt die Dateien
     in src und test kompilieren.
•   Wir benötigen die
    JUnit-Jar-Datei.




                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   51
JUnit-Tests
•   Wir führen einen Pfad path ein.

    <property name="test.dir" value="test" />
    <path id="path.compile">
    
 <path location="${classes.dir}"/>
    
 <path location="lib/junit-3.8.1.jar"/>
    </path>

•   Ein Pfad ist ein Datentyp von Ant (später mehr).
•   Der Pfad besteht aus dem Verzeichnis für die Klassen und
    der JUnit-Jar-Datei.



                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   52
JUnit-Tests
•   Diesen definierten Pfad benutzen wir im javac-Task mit
    refid.
    <target name="compile" depends="init">
    
 <javac srcdir="${src.dir}:${test.dir}"
                destdir="${classes.dir}">
    
 
       <classpath refid="path.compile"/>
    
 </javac>
    </target>
•   In srcdir werden die Properties mit einem Doppelpunkt
    getrennt.




                       © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   53
Kompilieren in src und test
•   Wir überprüfen die Änderungen




•   Es werden drei Dateien kompiliert, richtig.

                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   54
JUnit-Test-Task im Überblick
•   Den Pfad benutzen wir wieder.
    <target name="junit" depends="compile">
     <junit>
       <classpath refid="path.compile" />
       <formatter type="brief" usefile="false"/>
       <batchtest todir=".">
         <fileset dir="${classes.dir}">
           <include name="**/*Test.class" />
           <exclude name="**/Abstract*Test.class" />
         </fileset>
       </batchtest>
     </junit>
    </target>
                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   55
JUnit-Tests
•   Für den formatter gibt es: brief und xml.
        <formatter type="brief" usefile="false"/>
•   Batchtest führt mehrere Tests aus.
      <batchtest todir=".">
          <fileset dir="${classes.dir}">
            <include name="**/*Test.class" />
          </fileset>
        </batchtest>
•   Ein Fileset ist eine ungeordnete Menge von Dateien.
       • Muster mit include und exclude
•   ... später dazu mehr ...


                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   56
JUnit-Tests
•   JUnit meldet einen Fehler, Ant meldet SUCCESSFUL




•   Aber: Bugs sollen nicht ausgeliefert werden!

                       © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   57
JUnit-Tests
•   Wir müssen dem JUnit-Task mitteilen, welches Property
    er bei einem Error oder bei einer Failure setzen soll.
    <target name="junit" depends="compile">
      <junit errorproperty="test.failed"
              failureproperty="test.failed"> ...
      </junit>
      <fail message="JUnit tests failed!"
             if="test.failed" />
    </target>
•   Anschliessend wird der Task fail benutzt, falls das
    Property gesetzt ist.
•   Bedingte Ausführung von Tasks mit if und unless.
•   Damit ist der Build gescheitert.
                       © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   58
Versagen erwünscht
•   Das ist das gewünschte Ergebnis.




                      © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   59
JUnit-Tests
•   Wir möchten auch einen HTML-Report des JUnit-Tests.
•   Wir benötigen ein Verzeichnis für die Dateien.
    <property name="junit.dir" value="junit" />
•   Wir benutzen den XML-Formatter und schreiben in dieses
    Verzeichnis.
      ...
       <formatter type="xml"/>
        <batchtest todir="${junit.dir}">
        ...




                      © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   60
JUnit-Tests
•   Der JUnit-Prozess schreibt für jede Testklasse eine XML-
    Datei TEST-Klassenname.xml.

•   Hieraus erzeugen wir einen HTML-Report.
    <junitreport todir="${junit.dir}">
     <fileset dir="${junit.dir}">
       <include name="TEST-*.xml" />
     </fileset>
     <report format="frames" todir="${junit.dir}" />
    </junitreport>




                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   61
JUnit-Tests
•   Das Testergebnis.




                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   62
Dateien ignorieren
•   Wir können den BrokenDoctorTest vom JUnit-Test
    ausschließen.
•   Hierzu wird im Fileset exclude verwendet.

    <batchtest todir=".">
      <fileset dir="${classes.dir}">
        <include name="**/*Test.class" />
        <exclude name="**/Broken*Test.class" />
      </fileset>
    </batchtest>

•   Nur zur Demonstration. In der Realität sollte man keine
    Testfälle einfach ausschließen.
                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   63
Der JUnit-Test ist ok
•   Es ist jetzt alles wieder ok.




                         © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   64
Erstellen einer Jar-Datei
•   Eine Jar-Datei kann mit dem Task <jar> erstellt werden
    <property name="dest.name" value="doctor-0.1" /> ...
    <target name="jar" depends="junit">
     <jar destfile="${build.dir}/${dest.name}.jar"
          basedir="${classes.dir}">
       <manifest>
         <attribute name="Main-Class"
                     value="beispiel.Doctor" />
       </manifest>
    </target>
•   Die Main-Klasse wird extra angegeben.
•   Bevor dieser Task läuft, muss der JUnit-Test gefixt
    werden.
                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   65
Dokumentation
•   Wir benötigen Dokumentation.
    <property name="doc.dir" value="doc" />
•   Wir müssen das Quellverzeichnis, das Zielverzeichnis und
    den Klassenpfad angeben.
    <target name="doc" depends="compile">
      <javadoc destdir="${doc.dir}"
               sourcepath="${src.dir}"
               charset="UTF-8" docencoding="UTF-8">
        <classpath refid="path.compile" />
      </javadoc>
    </target>
•   Umlaute in UTF-8

                       © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   66
Dokumentation
•   Die Javadoc.




                   © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   67
Erstellen der Distribution
•   Wir erstellen eine Zip-Datei mit Jar und Dokumentation
    <property name="dest.name" value="doctor-0.1" />
    <zip destfile="${dest.name}.zip">
      <zipfileset file="${build.dir}/${dest.jar}"
                  prefix="${dest.name}" />
                                                                           Jar
      <zipfileset dir="${doc.dir}"
                  prefix="${dest.name}/doc">
          <include name="**/*.*"/>
      </zipfileset>                                                        Doc
    </zip>
•   Zipfileset ist eine Erweiterung von Fileset.
     • Hier kann mit prefix das Verzeichnis bestimmt werden.

                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com         68
Erstellen der Distribution
•   Wir machen den Task abhängig von doc und jar
    <target name="zip" depends="doc, jar">




                      © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   69
Upload der Distribution
•   Mit FTP stellen wir die neueste Version zur Verfügung.

    <target name="deploy" depends="zip">
      <ftp server="${server}" userid="${user}"
           password="${password}" action="put"
           remotedir=".">
        <fileset file="${dist.dir}/${dest.name}.zip" />
      </ftp>
    </target>


•   Die Aktionen werden in action definiert: put, get, del, ...
•   Hier wird ein Fileset verwendet, dass nur aus einer Datei
    besteht.
                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   70
Upload der Distribution
•   Ausführen ergibt allerdings einen Fehler.




•   FTP ist ein„optionaler Task“, wir benötigen eine
    zusätzliche Jar-Datei.
•   $ ant deploy -lib lib/commons-net-1.4.0.jar

                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   71
Der gesamte Prozess




            © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   72
Ant-Skripte dokumentieren
•   Ein Projekt wird im Element description erläutert.
    <project name="beispiel">
     <description>
       Beschreibung des Projekts.
     </description>


•   Targets und Tasks lassen sich mit dem description-
    Attribut dokumentieren.
    <target name="test"
           description="Führe den Test durch"...>


•   Die Informationen für das Projekt und die Targets werden
    mit projecthelp angezeigt.
                          © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   73
Ant auf der Kommandozeile



        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com
Ant auf der Kommandozeile
•   Viele IDEs unterstützen Ant
•   Aber:
     • Auch hier müssen Argumente angeben werden.
•   Darum:
     • Die wichtigsten sollte man kennen.

•   Der Aufruf von Ant hat die folgende Syntax.
    $ ant [options] [target [target2 [target3] ...]]


•   Beispiel
    $ ant -f b.xml -emacs -Dsrc.dir=src2 compile zip



                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   75
Optionen: Informationen
•   Die folgenden Optionen sind beim Debuggen hilfreich.

      -help                -h       Hilfe zu den Optionen

      -version                      Versionsinformationen

      -verbose             -v       Ausführlichere Informationen

      -diagnostics                  Listet Properties, Jar-Dateien, etc.

      -projecthelp         -p       Kurzinformationen

      -emacs                        Unterdrückt „[Taskname]“

      -debug               -d       Ausführliche Informationen

      -logfile FILE                 Ausgabe in Datei

      -logger CLASS                 Ein anderer Logger

                       © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com    76
Optionen: Anpassungen
•   Die folgenden Optionen sind Anpassungen.

      -buildfile FILE        -f       Benutzt eine andere Build-Datei

      -Dproperty=value                Setzt das Property auf den Wert

      -propertyfile FL                Benutzt Properties aus Datei

      -lib FILE                       Fügt Datei dem Klassenpfad hinzu

      -noinput                        Keine Eingabe

      -quiet                          Nur Fehler werden berichtet

      -keep-going            -k       Macht weiter nach Fehlern

                         © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   77
Optionen: Anpassungen
•   Die folgenden Optionen sind weitere Anpassungen.

      -nouserlib                Ignoriert $HOME/.ant/lib

      -noclasspath              Ignoriert CLASSPATH Umgeb.var.

      -autoproxy                Benutzt die Netzwerkeinstellung für
                                Proxies des Betriebssystems(Java 1.5)



      -inputhandler CL Die Klasse, die auf <input>-Events
                                reagieren soll

      -listener CL              Ein Listener, z. B. für Continous-
                                Integration-Tools
      -main CL                  Alternative Klasse für Ant
                         © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   78
Installation von Ant
•   Java Software Development Kit (SDK) wird benötigt
     • Umgebungsvariable JAVA_HOME muss gesetzt sein
     • PATH um $JAVA_HOME/bin erweitern
•   Download von http://ant.apache.org
     • Die aktuelle Version ist 1.7.1.
•   Entpacken in Verzeichnis ohne Leerzeichen
     • Umgebungsvariable ANT_HOME muss gesetzt sein
     • PATH um $ANT_HOME/bin erweitern
     • Sicherstellen, dass CLASSPATH nicht gesetzt ist
         • Das kann später Fehler verursachen
•   Optional:
     • Anpassung mit ANT_OPTS und ANT_ARGS
                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   79
Die Datentypen von Ant



       © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com
Motivierendes Beispiel
•   Ein Blick in die Dokumentation ...




                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   81
Unbekannte Fachbegriffe
•   Was bedeuten diese Begriffe ?
     • „patterns“
     • „directory based tasks“
     • „fileset“
     • „implicit fileset“
     • „nested include/exclude elements“
     • „nested patternset elements“
     • „nested filesets“
     • „extended fileset elements“
     • „extended groupfileset elements“

•   Fazit: Wir benötigen mehr Grundwissen über Ant !

                       © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   82
Datentypen
 •   Projekt
 •   Targets
 •   Tasks
      • Parameter von Tasks
 •   Diese Parameter haben einen Datentyp.

 •   Datatypes / Datentypen
      • Das Datenmodell ist gewachsen
            • Abwärtskompatibilität
            • Nicht immer einheitlich
      •   Sind in Java-Klassen implementiert.


                         © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   83
Datatypes / Datentypen
•   Datentypen
     • Properties und PropertySets
     • Resources und Resource Collections
           • Path, FileSet, FileList, DirSet, TarFileSet, ZipFileSet
     •   Auswahl von Dateien
           • Dateinamen: PatternSet
           • Eigenschaften: Selektoren
     •   Transformationen
           • Dateinamen: FileMapper
           • Inhalt: FilterSet, FilterChains und FilterReader
     •   Weitere:
           • Permissions, Directory-Based Tasks
           • I/O-Redirectors, Regexp, XMLCatalog
                            © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   84
Properties
•   Kennen wir aus dem „Grundkurs“
•   Properties haben einen Namen und enthalten Strings.
•   Derefenzierung mit ${propertyName}
•   Properties sind Konstanten
      • Einmal gesetzt, ändern sie sich nicht mehr
•   Werden zur Ablaufsteuerung benutzt.
•   Falls eine Property keinen Wert besitzt, wird sie als $
    {propertyName} ausgegeben.
    <echo>${nochNichtDefiniert}</echo>
•   ergibt ${nochNichtDefiniert}.
•   Es gibt viele vordefinierte Properties.
     • <echoproperties/> gibt diese aus.

                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   85
Definieren von Properties

• Properties können gesetzt werden. Der Wert ist nicht
  änderbar.
  <property name="sprachen" value="Ant und Java"/>
• Mit werden Dateien und Pfade zu absoluten Pfaden
  umgewandelt (wenn sie nicht im basedir liegen).
  <property name="build.dir" location="build"/>
• Properties können bei der Definition von Properties
  verwendet werden.
  <property name="classes.dir"
              location="${build.dir}/classes"/>
• Properties können aus Properties-Dateien geladen
  werden.
  <property file="build.properties"/>
                      © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   86
Definieren von Properties
•   Auch in den Properties-Dateien, können Properties in
    Definitionen verwendet werden.
    build.dir=build
    classes.dir=${build.dir}/classes
    dist.name=doctor-0.1
    dist.jar=${dist.name}.jar
•   Diese werden wie die mit value definierten behandelt.
•   Umgebungsvariablen können als Properties geladen
    werden.
    <property environment="env"/>
•   Zugriff mit env.VARIABLE, zum Beispiel.
    <echo>env.LANG=${env.LANG}</echo>



                           © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   87
Steuerung mit Properties: <available>
•   Der <available> Task setzt eine Property, wenn eine
    spezifizierte Ressource vorhanden ist.
     • Klassen, Dateien, Verzeichnisse, JVM-Ressourcen
•   <available property="istDa1"
               classname="java.lang.String"/>
    <available property="istDa2"
              classname="java.lang.Xtring"/>
    <echo>${istDa1}, ${istDa2}</echo>
•   Ergibt true, ${istDa2}
•   <available property="istDa" file="a.txt"
               type="file"/>
•   <available property="istDa" file="/usr/local/lib"
               type="dir"/>

                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   88
Steuerung mit Properties:
•   Der <condition> Task setzt eine Property, wenn die
    angegebene Bedingung zutrifft.
•   Der Task hat die folgenden Attribute
     • Das zu setzende property
     • Den Wert value
     • Den Wert else, der ansonsten zugewiesen wird
•   Beispiel
•   <condition property="c1" else="X" >
      <equals arg1="1" arg2="0"/>
    </condition>
•   ergibt X


                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   89
Steuerung mit Properties:
•   Bedingungen können geschachtelt werden.
•   <condition property="c2" value="Y">
     <or>
       <equals arg1="1" arg2="0"/>
       <not>
         <equals arg1="1" arg2="0"/>
       </not>
     </or>
    </condition>
•   Ergibt Y




                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   90
Steuerung mit Properties:
•   Ein Auswahl von „core conditions“

      <and>, <or>, <not>, <xor>                   Logische Verknüpfungen
      <isset>, <isreference>                      Ist gesetzt?
      <istrue>, <isfalse>                         Ist wahr, Ist falsch ?
      <equals>                                    Sind zwei Strings gleich ?
      <contains>                                  Ist String enthalten
      <matches>                                   Reguläre Ausdruck
      <available>                                 Wie der Task
      <filesmatch>                                Dateivergleich
      <isfileselected>                            Wurde Datei selektiert ?
      <socket>, <http>                            Ist erreichbar ?
                               © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   91
PropertySet
•   Properties können zu einem PropertySet
    zusammengefasst werden
•   Seit Ant Version 1.6
•   Eher Ant-Intern
      • Eventuell für einen eigenen Tasks verwendbar
•   Im allgemeinen nicht für Build-Prozesse




                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   92
Properties und Boolesche Werte
•   Ein Property kann einen Booleschen Wert darstellen.

•   Wahr sind
     •   true
     •   yes
     •   on


•   Falsch sind
     •   false
     •   no
     •   off




                       © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   93
Resource und Resource Collections
•   Resourcen sind „Datei-ähnliche“ Dinge
     • resource, file, javaresource, zipentry, tarentry
     • gzipresource, bzip2resource, url, string,
       propertyresource

•   Eine Resource Collection ist eine Menge von Resourcen
     • File resources
           • Fileset, Dirset, Filelist
           • Path
           • Tarfileset, Zipfileset
     •   PropertySet
           • Properties

                             © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   94
Path / Pfad
•   Auch „path-like-structure“ genannt
•   Benutzt für CLASSPATH und PATH Umgebungsvariablen
•   Geordnete Liste
     • Elemente sind Dateien und Verzeichnisse
     • Rekursiv, d.h. ein Pfad kann Unterpfade enthalten
•   Beispiel für einen Pfad mit einer Datei.
    <path>

     <pathelement location="lib/abc.jar"/>

 </path>




                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   95
Path / Pfad
•   Beispiel für einen Pfad mit einer Datei und einem
    Verzeichnis.
    <path>

     <pathelement location="lib/abc.jar"/>

     <pathelement location="build/classes"/>

 </path>
•   Kann auch als Unterpfad angegeben werden.
    <path>

     <pathelement path="lib/abc.jar:build/classes"/>

 </path>
•   Trennung mit Semikolon oder Doppelpunkt
•   Windows „C:“ wird berücksichtigt
•   Separatoren: Slash oder Backslash, „/“ oder „“
                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   96
Path / Pfad
•   Abkürzung: Wenn Pfad nur aus einer Location oder einem
    Pfad besteht.
    <path location="lib/abc.jar"/>
    <path path="lib/abc.jar:build/classes"/>
•   Die bisherigen Beispiele waren „standalone“.
     • Können nicht wiederverwendet werden.
•   Mit dem Attribut id kann ein Name zugewiesen werden.
    <path id="meinpfad">

     <pathelement path="lib/abc.jar:build/classes"/>

 </path>
•   Mit dem Attribut refid kann er verwendet werden.
    <path refid="meinpfad"/>
•   Ist der Pfad unbekannt, bricht Ant mit einem Fehler ab.
                           © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   97
Path / Pfad
•   Pfade können mit Filesets definiert werden.
    <path>

     <pathelement path="lib/abc.jar:build/classes"/>
     <fileset dir="test">
       <include name="**/*.txt"
     </fileset>

 </path>




                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   98
Fileset
•   Ungeordnete Liste
     • wie die mathematische Menge („set“)
     • Hat ein Verzeichnis als Wurzel
           • das ist der Hauptunterschied zum Pfad
     •   Per Default enthält es alle Dateien und Unterordner
     •   Inhalt wird bei der ersten Benutzung definiert, nicht bei
         der Deklaration!
     •   Statisch, werden nicht aktualisiert !
     •   Umfasst nur bereits existierende Elemente

•   Ausnahme: die sog. „Defaultexcludes“


                           © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   99
Fileset - Defaultexcludes
•   Es gibt Dateien, die nicht berücksichtigt werden sollen.
     • Backup-Kopien, die Editoren automatisch anlegen, *~
     • Dateien der Versionskontrolle CVS, .svn
•   Lösung: defaultexcludes
•   Folgender Task zeigt die defaultexcludes an.
    <defaultexcludes echo="true"/>
•   Die Liste ist änderbar. Sehr umsichtig damit umgehen.
    Ansonsten „verschwinden“ Dateien.
    <defaultexcludes add="**/*.bck"/>
    <defaultexcludes remove="**/*~"/>
•   Man kann die Voreinstellung wiederherstellen.
    <defaultexcludes default="true"/>


                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   100
Fileset
•   Ein Fileset benötigt immer das Attribut dir.
    <fileset dir="web"/>
•   Alle Dateien und Unterverzeichnisse von web.
•   Filesets können auch benannt und wiederverwendet
    werden.
    <fileset id="auftritt" dir="web"/>
•   Filesets können mit Patternsets und mit Selektoren
    eingeschränkt werden.
    <fileset dir="web">
      <include name=es= "**/*.jsp" />
      <contains text="WICHTIG"/>




                           © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   101
TarFileSet und ZipFileSet
•   Erweiterung von Fileset für Archive.
     • Dateien in Archiven haben besondere Eigenschaften.
•   Entweder das Attribut dir oder src ist notwendig
     • Bei dir wird wie vorher ein Verzeichnis benutzt
     • Bei src wird aus einem Archiv benutzt
•   Attribute
     • ZipFileSet
           • prefix, filemode, dirmode, encoding
     •   TarFileSet
           • prefix, filemode, dirmode, username, group, uid, gid



                           © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   102
Filelist und Dirset
•   Werden nicht so häufig verwendet.
•   Filelist
     • Wie Fileset, aber geordnet
     • Die Elemente müssen nicht existieren
     • Verwendet in <concat>, <dependset> und <pathconvert>
     • Als nested element in <path>
•   Dirset
     • Wie Fileset, enthält nur Verzeichnisse
     • Verwendet in <javadoc> und <pathconvert>
     • Als nested element in <path>



                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   103
Resource Collections
•   Resource Collections
     • enthalten 0..* Ressourcen
•   Es gibt Mengentheoretische Operationen für diese
     • <intersect> ist die Schnittmenge
     • <sort> sortiert die Elemente
     • <union> ist die Vereinigung
     • <restrict> ist ein Filter
•   Resource Collections sind noch relativ neu
     • ab Ant 1.7
     • nicht viele Tasks benutzen diese
     • eher selten in „normalen“ Build-Dateien

                      © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   104
Patternset
•   Ein Patternset ist ein Menge von Mustern (Strings)
     • Einschränkung eines Filesets nach dem Namen
     • Stichwort: „file-matching“
     • Kann rekursiv weitere Patternsets enthalten
•   Mögliche Einschränkungen
     • Include und Exclude
     • Exklusion vor Inklusion !
•   Unterstütze Muster

       *             beliebig viele Zeichen (auch keines)
       ?             Ein einzelnes Zeichen
       **            beliebig viele Verzeichnisse
       endet mit /   Das gesamte Verzeichnisses mit Inhalt
                          © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   105
Patternset
•   Explizite Verwendung mit patternset.
    <patternset>
     <include name="**/*.jsp"/>
     <exclude name="*Test.jsp"/>
    </patternset>
•   Implizite Verwendung im Fileset-Attribut.
    <fileset dir="lib" includes="*.jsp" />
•   Implizite Verwendung als Fileset-Element.
    <fileset>
     <include name="*.jsp"/>
    </fileset>




                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   106
Patternset
•   Übergabe als Attribute
     • includes, excludes, includesfile, excludesfile
•   Übergabe als Element
     • include, exclude, includesfile, excludesfile
     • Elemente können Konditional mit if/unless sein
•   Mit den *file-Versionen wird eine Datei angegeben, die die
    Muster enthält.

    <patternset>
     <include name="**/*.jsp"/>
     <exclude name="*Test.jsp" if="prod"/>
    </patternset>


                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   107
Selectors / Selektoren
•   Einschränkung eines Filesets nach Eigenschaften
•   Der Selektor wird auf jede Datei angewendet
•   Können in „selector containers“ angewendet werden.
•   Es gibt die folgenden Container.
        <and>        Alle Selektoren müssen matchen.

        <or>         Mind. ein Selektor muss matchen.

        <not>        Logisches Nicht für and und or.

        <none>       Kein Selektor matched.

        <selector>   Für Definition mit id.

        <majority>   Mehrheit

•   Container können verschachtelt werden.
•   Es können eigene definiert werden („custom selectors“)
                       © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   108
Selectors / Selektoren

  <contains>              Enthält die Datei einen best. Text
  <containsregexp>        Enthält die Datei einen reg. Ausdruck
  <date>                  Änderungsdatum
  <depend>                Neuer als in 2. Verzeichnis
  <depth>                 Verzeichnistiefe
  <different>             Falls unterschiedlich in 2. Verzeichnis
  <filename>              Wie <patternset>
  <modified>              Geänderte Dateien bez. Cache
  <present>               Falls in 2. Verzeichnis existiert
  <size>                  Größe
  <type>                  dir oder file
  <scriptselector>        Selektor in Skriptsprache
                     © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   109
Selectors / Selektoren
•   Das folgende Beispiel enthält nur die Dateien, die
     • Mit .xml enden
     • Den Text „project“ enthalten
     • Und deren Dateiname kein „a“ enthält
    <fileset dir=".">
     <and>
       <filename name="**/*.xml"/>
       <contains text="project" />
       <none>
         <filename name="**/*a*.xml"/>
       </none>
     </and>
    </fileset>
                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   110
FileMapper
•   Abbildung
     • Von bestehenden Dateien
     • Auf neue Dateinamen
•   Benutzt z. B. in
     •   <apply>, <copy>, <move>
•   Das folgende Beispiel benutzt den <globmapper> und kopiert
    alle *.xml Dateien und hängt ein *.bak an den
    Dateinamen.
    <copy todir="backup" >

     <fileset dir="." includes="**/*.xml"/>
     <globmapper from="*.xml" to="*.xml.bak"/>

 </copy>



                         © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   111
Mapper

  <chained>        Sequentielle Ausführung
  <composite>      Parallele Ausführung

  <filter>         FilterChain und FilterReader, später ...

  <flatten>        Entfernt Verzeichnisse

  <glob>           Einfaches Ersetzen, nur ein *

  <identity>       Identität, tut nichts

  <merge>          Alle Dateien kommen in eine Datei

  <package>        a/b/C.java zu a.b.C.java

  <regexp>         Wie <glob>, aber reguläre Ausdrücke

  <unpackage>      a.b.C.java zu a/b/C.java

  <scriptmapper>   Erweiterung durch Skriptsprache
                   © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   112
FilterSet
•   Ein FilterSet ist eine Menge von Filtern
•   Ein Filter kann Text in Dateien manipulieren
     • Suchen & Ersetzen in <copy>
•   Sehr schlechte Namensgebung!
•   Nicht bei binären Dateien verwenden !
•   Texte zwischen Anfangs- und Endtag werden ersetzt
•   Anfangs- und Endtags sind frei definierbar
     • Default ist „@“
•   Zum Beispiel: Zu ersetzen sind
    Datum: @DATUM@
    Datum: #@$DATUM#+!



                         © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   113
Filterset
•   Folgendes Beispiel setzt die Werte ein
    <copy file="Template.txt" tofile="README.txt">
      <filterset>
        <filter token="DATUM" value="2999-12-24"/>
      </filterset>
      <filterset begintoken="#@$" endtoken="#+!">
        <filter token="DATUM" value="3999-12-24"/>
      </filterset>
    </copy>
•   Es ergibt sich
    Datum: 2999-12-24
    Datum: 3999-12-24


                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   114
FilterChain und FilterReader
•   In Unix und Windows gibt es die „Pipes“
      • Die Ausgabe des ersten
      • ist die Eingabe des zweiten usw.
•   Zum Beispiel
     •   $ ps -ef | grep root | sort -n | lpr
     •  „Drucke die Liste der Prozesse von Root sortiert nach
        Prozess-ID aus“
•   Dieses gibt es auch in Ant (allerdings limitiert)
•   Eine FilterChain ist eine „Anreihung“ („Kette“) von
    FilterReadern.
•   Ein FilterReader
     • Liest die Eingabe
     • Manipuliert diese und gibt sie an die Ausgabe
                         © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   115
FilterChain und FilterReader
•   FilterReader werden verwendet in
     •   <concat>, <copy>, <move>, <exec>, <java>,                           etc.

    <fixcrlf>                       Für das CR/LF-Problem
    <headfilter>                    Wie Unix head, die ersten n Zeilen

    <tailfilter>                    Wie Unix tail, die letzten n Zeilen

    <tabstospaces>                  Ersetzt Tab mit Leerzeichen

    <prefixlines>                   Setzt ein Präfix vor jede Zeile

    <linecontains>                  Filter

    <stripjavacomments>             Entfernt Kommentare

    <striplinecomments>             Entfernt Kommentare, z. B. #, //, --

    <striplinecomments>
                          © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com          116
FilterChain und FilterReader
•   Das folgende Beispiel
     • Entfernt die Kommentare,
     • Ersetzt die Tabs
     • Und ersetzt die Zeilenbegrenzer auf „n“.

    <copy file="${src.dir}/beispiel/Doctor.java"
          tofile="Doctor2.java">
      <filterchain>
        <stripjavacomments/>
        <tabstospaces tablength="2"/>
        <fixcrlf eol="unix"/>
      </filterchain>
    </copy>
                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   117
Argumente als Attribut und Element
•   Es gibt oft zwei Möglichkeiten Parameter anzugeben
     • Als Attribut
     • Als Element
•   Zum Beispiel FileSet.
•   Die folgenden beiden Statements beschreiben das gleiche
    FileSet.
    <fileset dir="." includes="**/*.xml"/>
•   und
    <fileset>

     <include name="**/*.xml"/>

 </fileset>
•   Das Element ist flexibler, es erlaubt „nested elements“.

                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   118
Implizite Elemente
•   Ant beruht auf Java
     • Java ist Objekt-orientiert
     • Daher gibt es in Ant auch eine Art Vererbung
•   Der <javac> Task ist implizit auch ein FileSet.
    <javac srcdir="src" destdir="dest">
      <include name="**/*.java"/>
      <exclude name= "**/Broken*.java" >
    </javac>
• Ein FileSet hat ein Wurzelverzeichnis.
   • Bei <javac> wird dieses mit dem Attribut srcdir
      angegeben.
• <javac> ist ein „directory-based task“

                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   119
Nicht mehr unbekannte Fachbegriffe
•   Was bedeuten diese Begriffe ?
     • „patterns“                                PatternSet
     • „directory based tasks“
     • „fileset“
                                                z. B. <javac>
     • „implicit fileset“
     • „nested include/exclude elements“
     • „nested patternset elements“      FileSet, PatternSet
     • „nested filesets“
     • „extended fileset elements“
     • „extended groupfileset elements“      ZipFileSet,

•   Fazit: Wir haben Grundwissen über Ant !

                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   120
Die Tasks von Ant



    © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com
Typen von Tasks
•   Ant unterscheidet
     • Core Tasks
           • werden mitgeliefert in ant.jar
     •   Optionale Tasks
           • Tasks werden mitgeliefert, z. B. ant-junit.jar
           • zusätzliche Jar-Datei muss hinzugefügt werden
     •   3rd party
           • Werden von anderen entwickelt
     •   Custom
           • Eigenentwicklungen



                            © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   122
Core Tasks

 Ant-Basis            ... viele ...

 Archive              <ear>, <jar>, <signjar>, <tar>, <war>, <zip>

 Dateien              <basename>, <bzip2>, <dirname>, <chmod>,
                      <checksum>, <concat>, <copy>, <delete>, <fixcrlf>,
                      <genkey>, <gzip>, <mkdir>, <move>, <patch>, <touch>

 Java                 <apt>, <javac>, <javadoc>, <manifest>, <rmic>,

 Netzwerk / DB        <get>, <mail>, <sql>

 Prozesse             <apply>, <exec>, <java>, <nice>, <sleep>, <waitfor>

 Versionsverwaltung   <cvs>, <cvschangelog>, <cvsversion>, ...

 XML                  <xslt>




                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com    123
Optionale Tasks

 Archive              <cab>, <ejbjar>, <rpm>

 Netzwerk             <ftp>, <rexec>, <scp>, <setproxy>, <sshexe>,
                      <telnet>

 Sprachen             <antlr>, <depend>, <icontract>, <javacc>, <javah>,
                      <jdepend>, <jspc>, <netrexxc>, <script>,
                      <scriptdef>, verschiedene EJB 2

 Test                 <junit>, <junitreport>

 Text                 <native2ascii>, <replaceregexp>, <translate>

 Utilities            <image>, <propertyfile>, <sound>, <splash>

 Versionsverwaltung   ClearCase, Continuus, Perforce, PVCS, StarTeam,
                      Visual SourceSafe
 XML                  <schemavalidate>, <xmlvalidate>


                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   124
Ant-Contrib Tasks
 Ant             <antcallback>, <antfetch>, <runtarget>,
                 <relentless>

 Kontrollfluß    <assert>, <for>, <if>, <switch>, <throw>,
                 <trycatch>

 Plattform, OS   <osfamily>, <shellscript>

 Properties      <math>, <propertycopy>, <var>, <urlencode>,
                 <sortlist>, <propertyselector>, <pathtofileset>,
                 <propertyregexp>

 Conditions      <isgreaterthan>, <islessthan>, <ispropertyfalse>,
                 <ispropertytrue>

 Selektoren      <timestampselector>

 Netzwerk        <post>, <httpClient>, <httpState>

 Sonstiges       <outofdate>

                   © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   125
3rd Party Tasks

 Code-Qualität        PMD, Checkstyle, Findbugs, JavaNCSS

 J(2)EE               XDoclet, versch. Applikationsserver, Hibernate

 Netzwerk             WebDAV

 Sprachen             AspectJ, Groovy, Scala

 Test                 Cobertura, DbUnit, HtmlUnit, Jakarta Cactus, JMeter,
                      JUnitEE, TestNG, XMLUnit
 Texte                Apache FOP

 Versionsverwaltung   SvnAnt

 XML                  Apache XML Beans, Xjc (JAXB)




                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com     126
Bedingte Ausführung von Tasks
•   Tasks lassen sich bedingt ausführen.


 <target name="hello" if="isHello">

     <echo message="Hallo Welt"/>

 </target>


    <target name="goodbye" unless="isHello">

     <echo message="Tschüss Welt"/>

 </target>


•   Bei if muss das Property gesetzt sein.
•   Bei unless darf es nicht gesetzt sein.

                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   127
Tasks einbinden
•   Tasks
     • Sind Java-Klassen
     • Erben von org.apache.tools.ant.Task
     • Überschreiben der execute() Methode
•   Mit <taskdef> wird ein Task definiert
     • Der Name wird einer Klasse zugewiesen
    <taskdef name="dbunit"
             classname="org.dbunit.ant.DbUnitTask"
             classpathref="dbunit.path" />
•   Oder über Properties
    <taskdef resource="checkstyletask.properties"
             classpath="${cs.jar}"/>


                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   128
Tasks einbinden: Suche nach Jars
•   Hierzu muss die Klasse in einer Jar-Datei im CLASSPATH
    sein.
•   Ant sucht an den folgenden Orten nach Jars
     • Jedes Jar aus dem $CLASSPATH.
           • Wenn nicht -noclasspath angegeben wurde.
     •   Jedes Jar aus $ANT_HOME/lib
     •   Jedes Jar aus $HOME/.ant/lib
           • Wenn nicht -nouserlib angegeben wurde.
     • Jedes Jar, das als Argument von -lib angegeben wurde.
•   Tip: Mit dem folgenden Kommando werden alle Jars für
    die optionalen Tasks zu $HOME/.ant/lib heruntergeladen.
     •   $ cd $ANT_HOME
     •   $ ant -f fetch.xml all -Ddest=USERNAME


                         © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   129
Tasks einbinden: Troubleshooting
•   Bei optionalen oder 3rd party Tasks gibt es oftmals
    mehrere notwendige Jars
     • Eine Jar-Datei für den Task selber
           • Also die Erweiterung von Ant
     •   Eine Jar-Datei für das, was über Ant aufgerufen werden
         soll
           • Also das, um was Ant erweitert werden soll
     •   Desweiteren werden noch weitere Jars benötigt
           • Wie z. B. Logging

          Ant           Ant Task                   Erweiterung               Hilfs-Jars



                          © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com                130
Tasks einbinden: Troubleshooting
•   Beispiel der Fehlermeldung, wenn eine Jar-Datei für
    einen optionalen Task nicht im CLASSPATH ist.




•   Für <scp> löst -lib   lib/jsch-0.1.29.jar                        das Problem.
                           © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com         131
Tasks einbinden: Troubleshooting
•   Bei der folgenden Meldung wird JRuby vermisst.




•   Erkennbar an der ClassNotFoundException
                      © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   132
Core Tasks



 © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com
Core Tasks

 Ant-Basis          ... viele ...

 Archive            <ear>, <jar>, <signjar>, <tar>, <war>, <zip>

 Dateien            <basename>, <bzip2>, <dirname>, <chmod>,
                    <checksum>, <concat>, <copy>, <delete>, <fixcrlf>,
                    <genkey>, <gzip>, <mkdir>, <move>, <patch>, <touch>

 Java               <apt>, <javac>, <javadoc>, <manifest>, <rmic>,

 Netzwerk / DB      <get>, <mail>, <sql>

 Prozesse           <apply>, <exec>, <java>, <nice>, <sleep>, <waitfor>

 Versionsverwaltu   <cvs>, <cvschangelog>, <cvsversion>, ...
 ng
 XML                <xslt>



                       © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   134
Sequentiell und Parellel
•   Innerhalb eines Targets können Tasks sequentiell und
    parallel ausgeführt werden.
•   Dieses wird mit <sequential> und <parallel> erreicht.
    <parallel>
     <sequential>
       <echo>1-A</echo>
       <echo>1-B</echo>
     </sequential>
     <sequential>
       <echo>2-A</echo>
       <echo>2-B</echo>
     </sequential>
    </parallel>

                          © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   135
Sequentiell und Parellel
•   Hier das Ergebnis. Die Prozesse 1 und 2 laufen mit
    unterschiedlicher „Geschwindigkeit“.




                       © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   136
Default-Werte: <presetdef>
•   <presetdef> kann Attribute und Elemente vordefinieren.
•   Nützlich bei „parameter-intensiven“ Tasks.
     • Z. B. <sql> oder <javac>.
•   <presetdef name="meinEcho">
      <echo message="Halli-Hallo"/>
    </presetdef>
•   Aufruf mit:
•   <meinEcho/>


•   Achtung: Die Werte können wieder überschrieben
    werden.
    <meinEcho message="Guten Tag"/>
•   Daher nicht zum „Erzwingen“ von Konventionen geeignet.
                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   137
Neue Tasks: <macrodef>
•   Mit <macrodef> können neue Tasks definiert werden.
•   <macrodef name="meins">
     <attribute name="arg1" />
     <attribute name="arg2" default="default" />
     <attribute name="arg3" default="**/*.xml" />
     <text name="text" trim="false" optional="true" />
     <element name="files" optional="true"/>
     <sequential>
       <echo>@{arg1}, @{arg2}, @{arg3}</echo>
       <echo>Text: @{text}</echo>
       <echoxml><z><files/></z></echoxml>
     </sequential>
    </macrodef>
                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   138
Neue Tasks: <macrodef>
•   Es gibt drei Argumenttypen
     • Attribute
      <attribute name="arg2" default="default" />
     •   Textinhalte
      <text name="text" trim="false" optional="true" />
     •   Elemente
      <element name="files" optional="true"/>
•   Der Aufruf erfolgt z. B. folgendermaßen.
    <meins arg1="V" arg2="V2" arg3="**/*.xml:**/*.jsp">
      Hier ist ein Text
      <files><fileset include="**/*.txt"/></files>
    </meins>


                          © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   139
Neue Tasks und Datentypen
•   Mit <taskdef> können neue Tasks definiert werden.
    <taskdef name="ejbdoclet"
     classname="xdoclet.modules.ejb.EjbDocletTask"
     classpathref="xdoclet.class.path"/>
•   Hierfür gibt es bei mehreren optionalen Tasks Beispiele.

•   Mit <typedef> können neue Datentypen definiert werden.
    <typedef name="datetime"
     classname="org.xyz.DateTime"
     classpathref="somepathref"/>
•   Wird in der Praxis eher selten benutzt.


                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   140
Große Projeke: <antcall> und <ant>
•   Mit <antcall> können Targets aufgerufen werden.
•   Das folgende Target soll aufgerufen werden.

   <target name="a">

   
 <property name="p1" value="p1"/>

   
 <echo>A ${p1}</echo>

   </target>
•   Dieses führen wir mit folgenden Statements durch.
    <property name="p1" value="x1"/>
    <antcall target="a"/>
    <antcall target="a" inheritall="false"/>
•   Beim zweiten Aufruf werden die Properties nicht „vererbt“.
•   Anmerkung: Es gibt keine Rückgabewerte.


                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   141
Große Projeke: <antcall> und <ant>
•   Dieses führt zu dem abgebildeten
    Ergebnis.




•   Mit <ant> können auch Targets in anderen Build-Dateien
    verwendet werden.
•   <ant antfile="x.xml" target="a"/>
    <ant antfile="x.xml" target="a"
    inheritall="off"/>
•   Wird antfile nicht angegeben, dann wird build.xml
                      © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   142
Große Projeke: <import>
•   Build-Dateien können andere mit <import> importieren.
•   Dieses Statement kann überall im Dokument als Element
    von <project> stehen.
•   Wir haben zwei Build-Dateien: imported.xml und
    importer.xml. imported.xml definiert die beiden Targets
    a und b.
    <target name="a">
     <echo>Imported A</echo>
    </target>
    <target name="b">
     <echo>Imported B</echo>
    </target>



                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   143
Große Projeke: <import>
•   Die Datei importer.xml importiert X.
    <import file="imported.xml" />
•   Und überschreibt das Target b.

   <target name="b">

   
 <echo>Importer B</echo>

   </target>
•   Der Aufruf von
     •$    ant -f importer a b
•   zeigt, dass b überschrieben wurde.




                       © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   144
Core Tasks: Archive
•   <tar>  und <zip> schreiben die Dateien aus einem FileSet
    in eine Tar bzw. Zip-Datei.

    <tar destfile="a.tar" basedir="."
         includes="**/*.xml"/>


    <zip destfile="a.zip" basedir="."
         includes="**/*.xml"/>


•   <untar>   und <unzip> entpacken Archive.

    <untar src="a.tar" dest="testdir1"/>
    <unzip src="a.zip" dest="testdir2"/>

                         © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   145
Core Tasks: Archive - Jar
•   <jar> hat ein implizites FileSet, d.h. ein
  Wurzelverzeichnis.
• Dieses wird mit dem Attribut basedir angegeben.
• <ear> und <war> sind Erweiterung von <jar>.
   • Deren Funktionalität kann auch mit <jar> und den
     Attributen prefix und fullpath erreicht werden
• <war> kennt WEB-INF/lib und WEB-INF/classes
   • ZipFileSet Elemente sind vorhanden

•   Viele empfehlen duplicate="preserve", damit keine
    Elemente mit gleichem Namen in das Archiv kommen.



                         © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   146
Core Tasks: Archive - War
•   Eine War-Datei enthält Klassen, Webseiten, Jars, etc.
•   Diese können als FileSets spezifiert werden.
•   <target name="war" depends="compile">
     <war destfile="${dist.war}" webxml="${web.xml}">
       <classes dir="${classes.dir}">
         <include name="**/*.class"/>
         <exclude name="**/*Test.class"/>
       </classes>
       <fileset dir="${web.dir}"/>
     </war>
    </target>
•   Jetzt muss die War-Datei noch deployed werden.

                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   147
Core Tasks: Archive - War
•   Bei Servern, die „Hot-Deployment“ unterstützen, muss die
    Datei nur in das richtige Verzeichnis kopiert werden.
•   Ist der Server auf einem anderen Rechner: <scp>.
    <target name="deploy" depends="war">
     <copy todir="${deploy.dir}" file="${dist.war}"/>

   </target>

•   Anschliessend warten wir, bis die Anwendung gestartet ist.
    <target name="wait-deployed">
     <waitfor checkevery="1000" maxwait="15000">
       <http url="${app.url}" />
     </waitfor>
    </target>


                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   148
Core Tasks: Externe Prozesse
• Mit Ant lassen sich externe Prozesse aufrufen und
  kontrollieren.
• <apply> ruft ein externes Programm für jede Datei in
  einem FileSet auf.
    <apply command="ls -l">
      <fileset dir="." includes="*.xml"/>
    </apply>
•   <exec> ruft ein externes Programm mit bestimmten
    Argumenten auf.
    <exec executable="ls">
      <arg value="-l"/>
      <arg value="."/>
    </exec>

                          © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   149
Core Tasks: Externe Prozesse
•   Beide können mit dem Attribute spawn vom Ant-Prozess
    losgelöst werden (ähnlich nohup unter Unix).
•   Mit <nice> bekommt der aktuelle Prozess eine neue
    „niceness“.
    <nice newpriority="+10"/>
•   Schlafen mit <sleep>.
    <sleep minutes="3" seconds="25"/>
•   Mit <waitfor> kann auf die Erfüllung einer Condition warten
    bzw. bis ein Timeout auftritt.
    <waitfor checkevery="1000" maxwait="5000"
             timeoutproperty="not.available" >
     <socket server="localhost" port="8080" />
    </waitfor>

                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   150
Core Tasks: Externe Prozesse
•   Java-Klassen und Jar-Dateien lassen <java> sich mit
    aufrufen.
•   Mit dem Attribut fork kann eine neue Java Virtual
    Machine (JVM) gestartet werden.
•   Diese hat einen eigenen Classloader und -Path.
    Aufpassen.
    <java fork="true" classname="groovy.ui.Console"/>
•   Ergibt einen NoClassDefFoundError auch beim Start mit
    $ ant target -lib lib/groovy-all-1.5.5.jar
•   Entweder man verzichtet auf das Fork.
    <java classname="groovy.ui.Console"/>
•   Oder man setzt den Classpath.
•   <java fork="true" classname="groovy.ui.Console"
         classpathref="gpath">
                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   151
Optionale Tasks



   © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com
Optionale Tasks

 Archive            <cab>, <ejbjar>, <rpm>

 Netzwerk           <ftp>, <rexec>, <scp>, <setproxy>, <sshexe>,
                    <telnet>

 Sprachen           <antlr>, <depend>, <icontract>, <javacc>, <javah>,
                    <jdepend>, <jspc>, <netrexxc>, <script>,
                    <scriptdef>, verschiedene EJB 2

 Test               <junit>, <junitreport>

 Text               <native2ascii>, <replaceregexp>, <translate>

 Utilities          <image>, <propertyfile>, <sound>, <splash>

 Versionsverwaltu   ClearCase, Continuus, Perforce, PVCS, StarTeam,
 ng                 Visual SourceSafe
 XML                <schemavalidate>, <xmlvalidate>


                      © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   153
Optionale Tasks: SCP
•   SCP benötigt das jsch-Jar.

•   Das folgende Statement übertragt ein FileSet.

    <scp todir="${user}:${password}@${host}:${rpath}"
         sftp="true" verbose="true">
      <fileset dir="." includes="**/*.xml"/>
    </scp>




                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   154
Optionale Tasks: XML
•   Für XML gibt es zwei Validierungsschemata:
     • DTD
     • XML-Schema

•   Für DTD gibt es den Task <xmlvalidate>.
    <xmlvalidate file="${xml.dir}/tabellendaten.xml">
     <dtd publicid="TEST" location="dtd/schema.dtd"/>
    </xmlvalidate>


•   Für XML-Schema den Task <schemavalidate>.
    <schemavalidate file="${xml.dir}/tools.xml" />




                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   155
Optionale Tasks: JDepend
•   JDepend erstellt Metriken der Design-Qualität
     • siehe http://clarkware.com/software/JDepend.html
•   Der JDepend Task analysisiert die Klassen im
    classespath. Er erstelle eine XML-Datei.
<jdepend format="xml"
         outputfile="jdepend/jdepend-report">
  <exclude name="java*"/>
  ...
  <exclude name="junit.*"/>
  <classespath>
    <pathelement location="${classes.dir}" />
  </classespath>
  <classpath location="${classes.dir}" />
</jdepend>




                       © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   156
Optionale Tasks: JDepend
•   Im zweiten Schritt wird die XML-Datei mit <xslt> in eine
    HTML-Datei umgeformt.

•   <xslt basedir="jdepend"
         destdir="jdepend"
         includes="jdepend-report"
         style="lib/etc/jdepend.xsl" />




                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   157
Optionale Tasks: JDepend
•   Hier das Ergebnis von JDepend.




                      © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   158
Ant-Contrib Tasks



    © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com
Ant-Contrib Tasks
 Ant             <antcallback>, <antfetch>, <runtarget>,
                 <relentless>

 Kontrollfluß    <assert>, <for>, <if>, <switch>, <throw>,
                 <trycatch>

 Plattform, OS   <osfamily>, <shellscript>

 Properties      <math>, <propertycopy>, <var>, <urlencode>,
                 <sortlist>, <propertyselector>, <pathtofileset>,
                 <propertyregexp>

 Conditions      <isgreaterthan>, <islessthan>, <ispropertyfalse>,
                 <ispropertytrue>

 Selektoren      <timestampselector>

 Netzwerk        <post>, <httpClient>, <httpState>

 Sonstiges       <outofdate>

                   © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   160
Ant-Contrib Tasks
•   Ant-Contrib bietet eine Menge Erweiterung
     • Manche sehen diese Erweiterungen als zu „prozedural“
       an, denn Ant soll „deklarativ“ verwendet werden

•   Ant-Contrib ist als Antlib verwendbar.
     • Dieses ist ein recht neuer Packet-Mechanismus von Ant.

•   Um es zu verwenden, kann man es z. B. als XML-
    Namespace definieren.
    <project name="contrib"
             xmlns:c="antlib:net.sf.antcontrib">
•   Die Tasks sind dann mit <c:XYZ> und </c:XYZ> zu
    verwenden.
                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   161
Ant-Contrib Tasks: <if>
•   Wir testen die Erreichbarkeit eines Servers mit <if>.
    <c:if>
      <http url="${url}"/>                 <!-- <condition> -->
      <c:then>
        <echo>Server ist da!</echo>
      </c:then>
      <c:else>
        <echo>Server ist nicht da!</echo>
      </c:else>
    </c:if>


•   <if> erwartet als erstes Argument eine <condition>.

                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   162
Ant-Contrib Tasks: <switch>
•   Mit <switch> kann man z. B. eine Mehrfachabfrage
    machen. Wir testen, welche Shell der aktuelle Benutzer
    hat.

    <property environment="env"/>
    <c:switch value="${env.SHELL}">
     <c:case value="/bin/bash">
       <echo>Benutzer von Bash</echo>
     </c:case>
     <c:default>
       <echo>Sonstige Shell</echo>
     </c:default>
    </c:switch>

                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   163
Ant-Contrib Tasks: <foreach>
•   Mit <foreach> wird ein Target für jedes Element
    aufgerufen.
    <target name="kopf">
     <c:foreach list="1,2,3,4,5"
                target="koerper" param="i" />
    </target>
    <target name="koerper">
     <echo>Schritt ${i}</echo>
    </target>
•   Es können andere Delimiter mit <delimiter> angeben
    werden.
•   Achtung: Da jedesmal ein neus Target aufgerufen wird, ist
    hier auf die Performance zu achten.

                           © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   164
Ant-Contrib Tasks: <foreach>
•   Iterieren über die Elemente eines FileSets.
    <c:foreach target="koerper" param="i">
     <fileset dir="." />
    </c:foreach>


•   Wir können auch mehrere FileSets benutzen.
    <c:foreach target="koerper" param="i">
     <path>
       <fileset dir="src" />
       <fileset dir="test" />
     </path>
    </c:foreach>


                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   165
Ant-Contrib Tasks: <for>
•   Mit <for> ist das separate Target nicht notwendig.
    <c:for list="1,2,3,4,5" param="i">
      <sequential>
        <echo>Schritt @{i}</echo>
      </sequential>
    </c:for>


•   Intern wird <macrodef> benutzt.
      • Daher ist es notwendig, ‚@‘ zu benutzen.




                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   166
Ant-Contrib Tasks: <for>
•   Wir können auch ein FileSet benutzen.
    <c:for param="i">
      <fileset dir="." />
      <sequential>
        <echo>Schritt @{i}</echo>
      </sequential>
    </c:for>




                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   167
3rd Party Tasks



   © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com
3rd Party Tasks

 Code-Qualität        PMD, Checkstyle, Findbugs, JavaNCSS

 J(2)EE               XDoclet, versch. Applikationsserver, Hibernate

 Netzwerk             WebDAV

 Sprachen             AspectJ, Groovy, Scala

 Test                 Cobertura, DbUnit, HtmlUnit, Jakarta Cactus, JMeter,
                      JUnitEE, TestNG, XMLUnit
 Texte                Apache FOP

 Versionsverwaltung   SvnAnt

 XML                  Apache XML Beans, Xjc (JAXB)




                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com     169
DbUnit
•   DbUnit ist ein Testwerkzeug für die Datenbank.
     • Testdaten werden in XML-Dateien definiert.
•   Wir benötigen einen JDBC-Treiber.
    <path id="dbunit.path">
     
 <path   location="lib/slf4j-api-1.5.0.jar" />

   
 <path    location="lib/slf4j-simple-1.5.0.jar" />

   
 <path    location="${jdbc.jar}" />
     
 <path   location="lib/dbunit-2.2.jar" />

   </path>
•   Definition des Tasks.
    <taskdef name="dbunit"
             classname="org.dbunit.ant.DbUnitTask"
             classpathref="dbunit.path" />


                         © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   170
DbUnit
•   Export der DTD des Schemas.
    <dbunit driver="${driver}" url="${url}"
           userid="${user}" password="${password}">
     <export dest="${dbunit.dir}/schema.dtd"
              format="dtd" />
    </dbunit>
•   Export aller Tabellen in eine XML-Datei.
    <dbunit driver="${driver}" url="${url}"
           userid="${user}" password="${password}">
     <export dest="${dbunit.dir}/tabellendaten.xml" />
    </dbunit>
•   Beobachtung: Es ist sehr unpraktisch, dbunit zu
    verwenden, da immer die vier Parameter übergeben
    werden müssen.
                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   171
DbUnit und <presetdef>
•   Lösung: Mit <presetdef> können Default-Parameter an
    einen Wrapper-Task gebunden werden.
•   <presetdef name="mydbunit">
      <dbunit driver="${driver}" url="${url}"
                 userid="${user}" password="${password}"/>
    </presetdef>
•   Jetzt sieht der Export der DTD des Schemas
    folgendermaßen aus.
•   <mydbunit>
      <export dest="${dbunit.dir}/schema.dtd"
                  format="dtd" />
    </mydbunit>



                           © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   172
DbUnit und <presetdef>
•   Export der Tabelle „farbe“ mit SELECT-Statement und der
    Tabelle „osterei“.
•   <mydbunit>
     <export dest="${dbunit.dir}/partiell.xml">
       <query name="Q" sql="SELECT * FROM farbe"/>
       <table name="osterei"/>
     </export>
    </mydbunit>




                       © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   173
XDoclet
•   XDoclet
     • Attribute-Oriented-Programming
     • wird bei der EJB 2-Entwicklung angewendet
•   XDoclet bietet eine Menge von Ant-Tasks.
     • ejbdoclet
     • webdoclet
     • hibernatedoclet
     • springdoclet
     • jdodoclet
     • jmxdoclet
     • und noch einige mehr


                       © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   174
XDoclet: <ejbdoclet>
•   EJB 2-Anwendungen haben eine gewisse Redundanz an
    Interfacen. Diese sind jeweils für den Server und die
    Clients anzulegen.
•   Mit XDoclet werden im Sourcecode Tags hinterlegt, aus
    denen dann die entsprechenden Interfaces und Klassen
    generiert werden.
•   Der Pfad.
    <path id="xdoclet.class.path">
      <fileset dir="lib/xdoclet-1.2.3/lib"
              includes="*.jar"/>
      <fileset dir="lib/xdoclet-1.2.3/samples/lib"
               includes="*.jar"/>
    </path>


                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   175
XDoclet: <ejbdoclet>
•   Der Task.
    <taskdef name="ejbdoclet"
      classname="xdoclet.modules.ejb.EjbDocletTask"
      classpathref="xdoclet.class.path"/>
•   Der Aufruf für alle Dateien in src.dir.
    <ejbdoclet destdir="${generated.dir}"
       excludedtags="@author" ejbspec="2.0"
       addedtags="@xdoclet-generated at ${TODAY}">
      <fileset dir="${src.dir}"
                includes="**/*Bean.java"/>
•   Auf der nächsten Seite geht es weiter.


                         © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   176
XDoclet: <ejbdoclet>
•   Wir generieren Remote-, Local- und Home-Interfaces.
•   <remoteinterface pattern="{0}"/>
     <localinterface pattern="{0}Local"/>
     <homeinterface/>
     <localhomeinterface/>
     <session/>
     <utilobject cacheHomes="true" kind="physical"
                   includeGUID="true"/>
     <deploymentdescriptor destdir="${meta.inf}"/>
     <jboss version="4.0" destdir="${meta.inf}" />
    </ejbdoclet>
•   Eine genaue Erklärung wäre Out-of-Scope des Vortrags.

                         © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   177
JUnitEE
•   JUnitEE ermöglicht Unit-Tests auf dem Applikationsserver.
•   Mit <juniteewar> wird eine War-Datei erstellt, die den
    Testserver und die zu testenden Klassen enthält.
    <juniteewar destFile="${dist.dir}/${junitee.war}">
     <lib dir="lib" includes="*.jar>
     <classes dir="${classes.dir}"
              includes="**/*.class" />
     <testcases dir="${classes.dir}"
                 includes="**/*Test.class" />
    </juniteewar>
•   Mit <lib> werden die benötigten Bibliotheken und mit
    <testcases> die Testklassen angegeben.



                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   178
JUnitEE
•   Die Tests können automatisch mit Ant ausgeführt werden.
    <junitee url="${url}" printsummary="true">
     <test runall="true" />
    </junitee>
•   Oder manuell über eine Webseite.




                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   179
Groovy
•   Groovy ist eine dynamische Programmiersprache.
•   Es gibt zwei Tasks für Groovy.
•   Einen zum Ausführen von Groovy-Code direkt in Ant.
•   <taskdef name="groovy"
         classname="org.codehaus.groovy.ant.Groovy"
         classpath="${groovy.jar}"/>
•   Und einen Task zum Kompilieren von Groovy.
    <taskdef name="groovyc"
         classname="org.codehaus.groovy.ant.Groovyc"
         classpath="${groovy.jar}"/>


•   Groovy kann auch über die Script-Möglichkeiten von Ant
    genutzt werden. Siehe das Kapitel „Ant erweitern“.
                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   180
Groovy
•   Groovy-Programme können direkt in Ant verfasst werden.
•   <groovy>
      println "Hallo Groovy"
      int n = 100
      def ks = (0..n).toList().inject(0) { a,b -> a+b }
      println "Die Summe von 1..${n} ist ${ks}"
    </groovy>




                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   181
Groovy
•   Groovy ist vollständig in
    Java integriert.
•   Groovy kann Java-Klassen
    benutzen und umgekehrt.
    <groovy>
      import java.text.SimpleDateFormat
      def gc = new GregorianCalendar()
      gc.time = new Date()
      gc.add Calendar.MONTH, 3
      def format = new SimpleDateFormat('dd.MM.yyyy')
      println "In drei Monaten ist der "
        + format.format(gc.time)
    </groovy>
                        © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   182
PMD
•   PMD ist ein Werkzeug zur Quellcodeanalyse.
     • Es kann mögliche Fehler, suboptimalen Code, etc. finden
     • Ist mit Regeln konfigurier und erweiterbar
•   Wir definieren einen Pfad für die benötigten Jars.
    <path id="pmd.class.path">

   
 <path location="lib/jasm-3.1.jar"/>

   
 <path location="lib/jaxen-1.1.1.jar"/>

   
 <path location="lib/pmd-4.2.1.jar"/>

   </path>
•   Wir definieren den PMD-Task.
    <taskdef name="pmd"
          classname="net.sourceforge.pmd.ant.PMDTask"
          classpath="lib/pmd-4.2.1.jar" />


                          © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com   183
Ant im Detail
Ant im Detail
Ant im Detail
Ant im Detail
Ant im Detail
Ant im Detail
Ant im Detail
Ant im Detail
Ant im Detail
Ant im Detail
Ant im Detail
Ant im Detail
Ant im Detail
Ant im Detail
Ant im Detail
Ant im Detail
Ant im Detail
Ant im Detail
Ant im Detail
Ant im Detail
Ant im Detail
Ant im Detail
Ant im Detail
Ant im Detail
Ant im Detail
Ant im Detail
Ant im Detail
Ant im Detail
Ant im Detail
Ant im Detail
Ant im Detail
Ant im Detail
Ant im Detail
Ant im Detail
Ant im Detail
Ant im Detail
Ant im Detail
Ant im Detail
Ant im Detail

Contenu connexe

Tendances

BED-Con - Tools für den täglichen Kampf als Entwickler
BED-Con - Tools für den täglichen Kampf als EntwicklerBED-Con - Tools für den täglichen Kampf als Entwickler
BED-Con - Tools für den täglichen Kampf als EntwicklerPatrick Baumgartner
 
Docker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-PatternsDocker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-PatternsQAware GmbH
 
Flexibilitaet mit CDI und Apache DeltaSpike
Flexibilitaet mit CDI und Apache DeltaSpikeFlexibilitaet mit CDI und Apache DeltaSpike
Flexibilitaet mit CDI und Apache DeltaSpikeos890
 
IBM Lotus Notes - From PLATO to the Leading Groupware Platform
IBM Lotus Notes - From PLATO to the Leading Groupware PlatformIBM Lotus Notes - From PLATO to the Leading Groupware Platform
IBM Lotus Notes - From PLATO to the Leading Groupware PlatformUlrich Krause
 
DevOps der Triple-E Klasse - Eclipse DemoCamp
DevOps der Triple-E Klasse - Eclipse DemoCampDevOps der Triple-E Klasse - Eclipse DemoCamp
DevOps der Triple-E Klasse - Eclipse DemoCampWerner Keil
 
Continuous Delivery - Development Tool Chain - Virtualisierung, Packer, Vagra...
Continuous Delivery - Development Tool Chain - Virtualisierung, Packer, Vagra...Continuous Delivery - Development Tool Chain - Virtualisierung, Packer, Vagra...
Continuous Delivery - Development Tool Chain - Virtualisierung, Packer, Vagra...inovex GmbH
 
Docker Workshop Experten Forum Stuttgart 2015, Agile Methoden GmbH
Docker Workshop Experten Forum Stuttgart 2015, Agile Methoden GmbHDocker Workshop Experten Forum Stuttgart 2015, Agile Methoden GmbH
Docker Workshop Experten Forum Stuttgart 2015, Agile Methoden GmbHagilemethoden
 
Vagrant, Puppet, Docker für Entwickler und Architekten
Vagrant, Puppet, Docker für Entwickler und ArchitektenVagrant, Puppet, Docker für Entwickler und Architekten
Vagrant, Puppet, Docker für Entwickler und ArchitektenOPITZ CONSULTING Deutschland
 
Automatischer Build mit Maven - OPITZ CONSULTING - Stefan Scheidt
Automatischer Build mit Maven - OPITZ CONSULTING - Stefan ScheidtAutomatischer Build mit Maven - OPITZ CONSULTING - Stefan Scheidt
Automatischer Build mit Maven - OPITZ CONSULTING - Stefan ScheidtOPITZ CONSULTING Deutschland
 
Entwicklungsprozess und Arbeit mit Symfony2 in der fotocommunity GmbH
Entwicklungsprozess und Arbeit mit Symfony2 in der fotocommunity GmbHEntwicklungsprozess und Arbeit mit Symfony2 in der fotocommunity GmbH
Entwicklungsprozess und Arbeit mit Symfony2 in der fotocommunity GmbHstijink
 
Perl Renaissance Reloaded
Perl Renaissance ReloadedPerl Renaissance Reloaded
Perl Renaissance ReloadedGregor Goldbach
 
Docker - Containervirtualisierung leichtgemacht
Docker - Containervirtualisierung leichtgemachtDocker - Containervirtualisierung leichtgemacht
Docker - Containervirtualisierung leichtgemachtB1 Systems GmbH
 
Docker - Automatisches Deployment für Linux-Instanzen
Docker - Automatisches Deployment für Linux-Instanzen Docker - Automatisches Deployment für Linux-Instanzen
Docker - Automatisches Deployment für Linux-Instanzen B1 Systems GmbH
 
Boost your APEX Deployment and Provisioning with Docker
Boost your APEX Deployment and Provisioning with DockerBoost your APEX Deployment and Provisioning with Docker
Boost your APEX Deployment and Provisioning with DockerSteven Grzbielok
 
Wie skaliert man Software as a Service Applikationen in der Windows Azure Cloud
Wie skaliert man Software as a Service Applikationen in der Windows Azure CloudWie skaliert man Software as a Service Applikationen in der Windows Azure Cloud
Wie skaliert man Software as a Service Applikationen in der Windows Azure CloudPatric Boscolo
 
OSDC 2013 | Continuous Integration in data centers by Michael Prokop
OSDC 2013 | Continuous Integration in data centers by Michael ProkopOSDC 2013 | Continuous Integration in data centers by Michael Prokop
OSDC 2013 | Continuous Integration in data centers by Michael ProkopNETWAYS
 
Electron.NET: Cross-Platform Desktop Software mit ASP.NET Core
Electron.NET: Cross-Platform Desktop Software mit ASP.NET CoreElectron.NET: Cross-Platform Desktop Software mit ASP.NET Core
Electron.NET: Cross-Platform Desktop Software mit ASP.NET CoreGregor Biswanger
 

Tendances (20)

XPages - The Basics
XPages - The BasicsXPages - The Basics
XPages - The Basics
 
BED-Con - Tools für den täglichen Kampf als Entwickler
BED-Con - Tools für den täglichen Kampf als EntwicklerBED-Con - Tools für den täglichen Kampf als Entwickler
BED-Con - Tools für den täglichen Kampf als Entwickler
 
Docker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-PatternsDocker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-Patterns
 
Flexibilitaet mit CDI und Apache DeltaSpike
Flexibilitaet mit CDI und Apache DeltaSpikeFlexibilitaet mit CDI und Apache DeltaSpike
Flexibilitaet mit CDI und Apache DeltaSpike
 
Jenkins Acceleration
Jenkins AccelerationJenkins Acceleration
Jenkins Acceleration
 
IBM Lotus Notes - From PLATO to the Leading Groupware Platform
IBM Lotus Notes - From PLATO to the Leading Groupware PlatformIBM Lotus Notes - From PLATO to the Leading Groupware Platform
IBM Lotus Notes - From PLATO to the Leading Groupware Platform
 
DevOps der Triple-E Klasse - Eclipse DemoCamp
DevOps der Triple-E Klasse - Eclipse DemoCampDevOps der Triple-E Klasse - Eclipse DemoCamp
DevOps der Triple-E Klasse - Eclipse DemoCamp
 
Continuous Delivery - Development Tool Chain - Virtualisierung, Packer, Vagra...
Continuous Delivery - Development Tool Chain - Virtualisierung, Packer, Vagra...Continuous Delivery - Development Tool Chain - Virtualisierung, Packer, Vagra...
Continuous Delivery - Development Tool Chain - Virtualisierung, Packer, Vagra...
 
Docker Workshop Experten Forum Stuttgart 2015, Agile Methoden GmbH
Docker Workshop Experten Forum Stuttgart 2015, Agile Methoden GmbHDocker Workshop Experten Forum Stuttgart 2015, Agile Methoden GmbH
Docker Workshop Experten Forum Stuttgart 2015, Agile Methoden GmbH
 
Vagrant, Puppet, Docker für Entwickler und Architekten
Vagrant, Puppet, Docker für Entwickler und ArchitektenVagrant, Puppet, Docker für Entwickler und Architekten
Vagrant, Puppet, Docker für Entwickler und Architekten
 
Automatischer Build mit Maven - OPITZ CONSULTING - Stefan Scheidt
Automatischer Build mit Maven - OPITZ CONSULTING - Stefan ScheidtAutomatischer Build mit Maven - OPITZ CONSULTING - Stefan Scheidt
Automatischer Build mit Maven - OPITZ CONSULTING - Stefan Scheidt
 
Entwicklungsprozess und Arbeit mit Symfony2 in der fotocommunity GmbH
Entwicklungsprozess und Arbeit mit Symfony2 in der fotocommunity GmbHEntwicklungsprozess und Arbeit mit Symfony2 in der fotocommunity GmbH
Entwicklungsprozess und Arbeit mit Symfony2 in der fotocommunity GmbH
 
Perl Renaissance Reloaded
Perl Renaissance ReloadedPerl Renaissance Reloaded
Perl Renaissance Reloaded
 
Docker - Containervirtualisierung leichtgemacht
Docker - Containervirtualisierung leichtgemachtDocker - Containervirtualisierung leichtgemacht
Docker - Containervirtualisierung leichtgemacht
 
Docker - Automatisches Deployment für Linux-Instanzen
Docker - Automatisches Deployment für Linux-Instanzen Docker - Automatisches Deployment für Linux-Instanzen
Docker - Automatisches Deployment für Linux-Instanzen
 
Boost your APEX Deployment and Provisioning with Docker
Boost your APEX Deployment and Provisioning with DockerBoost your APEX Deployment and Provisioning with Docker
Boost your APEX Deployment and Provisioning with Docker
 
systemd & Docker
systemd & Dockersystemd & Docker
systemd & Docker
 
Wie skaliert man Software as a Service Applikationen in der Windows Azure Cloud
Wie skaliert man Software as a Service Applikationen in der Windows Azure CloudWie skaliert man Software as a Service Applikationen in der Windows Azure Cloud
Wie skaliert man Software as a Service Applikationen in der Windows Azure Cloud
 
OSDC 2013 | Continuous Integration in data centers by Michael Prokop
OSDC 2013 | Continuous Integration in data centers by Michael ProkopOSDC 2013 | Continuous Integration in data centers by Michael Prokop
OSDC 2013 | Continuous Integration in data centers by Michael Prokop
 
Electron.NET: Cross-Platform Desktop Software mit ASP.NET Core
Electron.NET: Cross-Platform Desktop Software mit ASP.NET CoreElectron.NET: Cross-Platform Desktop Software mit ASP.NET Core
Electron.NET: Cross-Platform Desktop Software mit ASP.NET Core
 

En vedette

Phing - A PHP Build Tool (An Introduction)
Phing - A PHP Build Tool (An Introduction)Phing - A PHP Build Tool (An Introduction)
Phing - A PHP Build Tool (An Introduction)Michiel Rook
 
produção de games com tecnologia livre ou proprietária, Qual usar?
produção de games com tecnologia livre ou proprietária, Qual usar?produção de games com tecnologia livre ou proprietária, Qual usar?
produção de games com tecnologia livre ou proprietária, Qual usar?Renan Nespolo
 
Performance im Fokus
Performance im FokusPerformance im Fokus
Performance im FokusInxmail GmbH
 
Mehr Wert für Gesellschaft und Unternehmen - Ratgeber für wirkungsvolle Unter...
Mehr Wert für Gesellschaft und Unternehmen - Ratgeber für wirkungsvolle Unter...Mehr Wert für Gesellschaft und Unternehmen - Ratgeber für wirkungsvolle Unter...
Mehr Wert für Gesellschaft und Unternehmen - Ratgeber für wirkungsvolle Unter...PHINEO gemeinnützige AG
 
Was User lieben, was sie hassen - Gregor Urech, Sibylle Peuker, Zeix AG
Was User lieben, was sie hassen - Gregor Urech, Sibylle Peuker, Zeix AGWas User lieben, was sie hassen - Gregor Urech, Sibylle Peuker, Zeix AG
Was User lieben, was sie hassen - Gregor Urech, Sibylle Peuker, Zeix AGONE Schweiz
 
Werksverzeichnis Hans Martin 1916
Werksverzeichnis Hans Martin 1916Werksverzeichnis Hans Martin 1916
Werksverzeichnis Hans Martin 1916Hugo E Martin
 
Python, Google App Engine e Webapp-CE
Python, Google App Engine e Webapp-CE Python, Google App Engine e Webapp-CE
Python, Google App Engine e Webapp-CE Renzo Nuccitelli
 
Social Media für Unternehmen und Institutionen
Social Media für Unternehmen und InstitutionenSocial Media für Unternehmen und Institutionen
Social Media für Unternehmen und InstitutionenChristian Moeller
 
Adforallprsentation 100914100808 Phpapp02
Adforallprsentation 100914100808 Phpapp02Adforallprsentation 100914100808 Phpapp02
Adforallprsentation 100914100808 Phpapp02fabrice_TALAZAC
 
TDD com Python e App Engine
TDD com Python e App EngineTDD com Python e App Engine
TDD com Python e App EngineRicardo Bánffy
 
Open Source BPM - iteratec Architekturtag
Open Source BPM - iteratec ArchitekturtagOpen Source BPM - iteratec Architekturtag
Open Source BPM - iteratec Architekturtagcamunda services GmbH
 
Congreso visión 2012 - taller introducción app engine
Congreso visión 2012 - taller introducción app engineCongreso visión 2012 - taller introducción app engine
Congreso visión 2012 - taller introducción app engineNigeŗ Arce
 
Presentation SEO/SEM
Presentation SEO/SEMPresentation SEO/SEM
Presentation SEO/SEMHicham SBINI
 
Google app engine para lean startups: the good, the bad and the ugly
Google app engine para lean startups: the good, the bad and the uglyGoogle app engine para lean startups: the good, the bad and the ugly
Google app engine para lean startups: the good, the bad and the uglyPET Computação
 
Tecnicas SEO
Tecnicas SEOTecnicas SEO
Tecnicas SEObluekiu
 
CAP 2: SEO - Técnicas de SEO
CAP 2: SEO - Técnicas de SEOCAP 2: SEO - Técnicas de SEO
CAP 2: SEO - Técnicas de SEOGary Briceño
 

En vedette (20)

Phing - A PHP Build Tool (An Introduction)
Phing - A PHP Build Tool (An Introduction)Phing - A PHP Build Tool (An Introduction)
Phing - A PHP Build Tool (An Introduction)
 
Smart Industry
Smart IndustrySmart Industry
Smart Industry
 
20100506 JAX BPMN 2.0 in der Praxis
20100506 JAX BPMN 2.0 in der Praxis20100506 JAX BPMN 2.0 in der Praxis
20100506 JAX BPMN 2.0 in der Praxis
 
produção de games com tecnologia livre ou proprietária, Qual usar?
produção de games com tecnologia livre ou proprietária, Qual usar?produção de games com tecnologia livre ou proprietária, Qual usar?
produção de games com tecnologia livre ou proprietária, Qual usar?
 
Performance im Fokus
Performance im FokusPerformance im Fokus
Performance im Fokus
 
Mehr Wert für Gesellschaft und Unternehmen - Ratgeber für wirkungsvolle Unter...
Mehr Wert für Gesellschaft und Unternehmen - Ratgeber für wirkungsvolle Unter...Mehr Wert für Gesellschaft und Unternehmen - Ratgeber für wirkungsvolle Unter...
Mehr Wert für Gesellschaft und Unternehmen - Ratgeber für wirkungsvolle Unter...
 
Was User lieben, was sie hassen - Gregor Urech, Sibylle Peuker, Zeix AG
Was User lieben, was sie hassen - Gregor Urech, Sibylle Peuker, Zeix AGWas User lieben, was sie hassen - Gregor Urech, Sibylle Peuker, Zeix AG
Was User lieben, was sie hassen - Gregor Urech, Sibylle Peuker, Zeix AG
 
Werksverzeichnis Hans Martin 1916
Werksverzeichnis Hans Martin 1916Werksverzeichnis Hans Martin 1916
Werksverzeichnis Hans Martin 1916
 
Python, Google App Engine e Webapp-CE
Python, Google App Engine e Webapp-CE Python, Google App Engine e Webapp-CE
Python, Google App Engine e Webapp-CE
 
Communicating sustainibility
Communicating sustainibilityCommunicating sustainibility
Communicating sustainibility
 
Social Media für Unternehmen und Institutionen
Social Media für Unternehmen und InstitutionenSocial Media für Unternehmen und Institutionen
Social Media für Unternehmen und Institutionen
 
Adforallprsentation 100914100808 Phpapp02
Adforallprsentation 100914100808 Phpapp02Adforallprsentation 100914100808 Phpapp02
Adforallprsentation 100914100808 Phpapp02
 
TDD com Python e App Engine
TDD com Python e App EngineTDD com Python e App Engine
TDD com Python e App Engine
 
Open Source BPM - iteratec Architekturtag
Open Source BPM - iteratec ArchitekturtagOpen Source BPM - iteratec Architekturtag
Open Source BPM - iteratec Architekturtag
 
Congreso visión 2012 - taller introducción app engine
Congreso visión 2012 - taller introducción app engineCongreso visión 2012 - taller introducción app engine
Congreso visión 2012 - taller introducción app engine
 
Presentation SEO/SEM
Presentation SEO/SEMPresentation SEO/SEM
Presentation SEO/SEM
 
Google app engine para lean startups: the good, the bad and the ugly
Google app engine para lean startups: the good, the bad and the uglyGoogle app engine para lean startups: the good, the bad and the ugly
Google app engine para lean startups: the good, the bad and the ugly
 
Tecnicas SEO
Tecnicas SEOTecnicas SEO
Tecnicas SEO
 
Ogre Game Engine
Ogre Game EngineOgre Game Engine
Ogre Game Engine
 
CAP 2: SEO - Técnicas de SEO
CAP 2: SEO - Técnicas de SEOCAP 2: SEO - Técnicas de SEO
CAP 2: SEO - Técnicas de SEO
 

Similaire à Ant im Detail

Von Test nach Live mit Rex
Von Test nach Live mit RexVon Test nach Live mit Rex
Von Test nach Live mit RexJan Gehring
 
Von Test nach live mit Rex
Von Test nach live mit RexVon Test nach live mit Rex
Von Test nach live mit Rexinovex GmbH
 
Tipps zur Performanceoptimierung für Liferay Portal
Tipps zur  Performanceoptimierung für Liferay PortalTipps zur  Performanceoptimierung für Liferay Portal
Tipps zur Performanceoptimierung für Liferay PortalStefan Hilpp
 
Grails im Überblick und in der Praxis
Grails im Überblick und in der PraxisGrails im Überblick und in der Praxis
Grails im Überblick und in der PraxisTobias Kraft
 
JavaScript goes Enterprise - Node.js-Anwendungen mit Visual Studio und den No...
JavaScript goes Enterprise - Node.js-Anwendungen mit Visual Studio und den No...JavaScript goes Enterprise - Node.js-Anwendungen mit Visual Studio und den No...
JavaScript goes Enterprise - Node.js-Anwendungen mit Visual Studio und den No...Peter Hecker
 
Ruby on Rails in a metro session
Ruby on Rails in a metro sessionRuby on Rails in a metro session
Ruby on Rails in a metro sessionVirttoo org
 
Gradle - Beginner's Workshop (german)
Gradle - Beginner's Workshop (german)Gradle - Beginner's Workshop (german)
Gradle - Beginner's Workshop (german)Joachim Baumann
 
JavaScript für Java-Entwickler W-JAX 2013
JavaScript für Java-Entwickler W-JAX 2013JavaScript für Java-Entwickler W-JAX 2013
JavaScript für Java-Entwickler W-JAX 2013Oliver Zeigermann
 
Desktop Containers 12: Next Generation of ZENworks Application Virtualization
Desktop Containers 12: Next Generation of ZENworks Application VirtualizationDesktop Containers 12: Next Generation of ZENworks Application Virtualization
Desktop Containers 12: Next Generation of ZENworks Application VirtualizationGWAVA
 
JavaScript goes Enterprise - Node.js-Anwendungen mit Visual Studio und den No...
JavaScript goes Enterprise - Node.js-Anwendungen mit Visual Studio und den No...JavaScript goes Enterprise - Node.js-Anwendungen mit Visual Studio und den No...
JavaScript goes Enterprise - Node.js-Anwendungen mit Visual Studio und den No...Peter Hecker
 
Continuous Delivery für Cloud-native Anwendungen auf Cloud-nativer Infrastruktur
Continuous Delivery für Cloud-native Anwendungen auf Cloud-nativer InfrastrukturContinuous Delivery für Cloud-native Anwendungen auf Cloud-nativer Infrastruktur
Continuous Delivery für Cloud-native Anwendungen auf Cloud-nativer InfrastrukturQAware GmbH
 
digitalSTROM Developer Day 2011: Jump Start in die digitalSTROM-Server Entwic...
digitalSTROM Developer Day 2011: Jump Start in die digitalSTROM-Server Entwic...digitalSTROM Developer Day 2011: Jump Start in die digitalSTROM-Server Entwic...
digitalSTROM Developer Day 2011: Jump Start in die digitalSTROM-Server Entwic...digitalSTROM.org
 
Robuste Design Systems mit Storybook und Angular: vom Konzept zur lebendigen ...
Robuste Design Systems mit Storybook und Angular: vom Konzept zur lebendigen ...Robuste Design Systems mit Storybook und Angular: vom Konzept zur lebendigen ...
Robuste Design Systems mit Storybook und Angular: vom Konzept zur lebendigen ...Andreas Wissel
 
"git.net" gibt's nicht?
"git.net" gibt's nicht?"git.net" gibt's nicht?
"git.net" gibt's nicht?inovex GmbH
 
Ruby on Rails - Eine kurze Einführung
Ruby on Rails - Eine kurze EinführungRuby on Rails - Eine kurze Einführung
Ruby on Rails - Eine kurze EinführungThomas R. Koll
 
Deployment von Entwicklungsumgebungen eines TYPO3-Intranets mit Vagrant
Deployment von Entwicklungsumgebungen eines TYPO3-Intranets mit VagrantDeployment von Entwicklungsumgebungen eines TYPO3-Intranets mit Vagrant
Deployment von Entwicklungsumgebungen eines TYPO3-Intranets mit VagrantChristoph Möller
 
Icinga 2009 at Nagios Workshop
Icinga 2009 at Nagios WorkshopIcinga 2009 at Nagios Workshop
Icinga 2009 at Nagios WorkshopIcinga
 
Foreman: Docker Integration (Webinar vom 05. Oktober_2016)
Foreman: Docker Integration (Webinar vom 05. Oktober_2016)Foreman: Docker Integration (Webinar vom 05. Oktober_2016)
Foreman: Docker Integration (Webinar vom 05. Oktober_2016)NETWAYS
 
OSMC 2011 | Collectd in der großen weiten Welt - Anbindung des Datensammlers ...
OSMC 2011 | Collectd in der großen weiten Welt - Anbindung des Datensammlers ...OSMC 2011 | Collectd in der großen weiten Welt - Anbindung des Datensammlers ...
OSMC 2011 | Collectd in der großen weiten Welt - Anbindung des Datensammlers ...NETWAYS
 

Similaire à Ant im Detail (20)

Von Test nach Live mit Rex
Von Test nach Live mit RexVon Test nach Live mit Rex
Von Test nach Live mit Rex
 
Von Test nach live mit Rex
Von Test nach live mit RexVon Test nach live mit Rex
Von Test nach live mit Rex
 
Tipps zur Performanceoptimierung für Liferay Portal
Tipps zur  Performanceoptimierung für Liferay PortalTipps zur  Performanceoptimierung für Liferay Portal
Tipps zur Performanceoptimierung für Liferay Portal
 
Grails im Überblick und in der Praxis
Grails im Überblick und in der PraxisGrails im Überblick und in der Praxis
Grails im Überblick und in der Praxis
 
JavaScript goes Enterprise - Node.js-Anwendungen mit Visual Studio und den No...
JavaScript goes Enterprise - Node.js-Anwendungen mit Visual Studio und den No...JavaScript goes Enterprise - Node.js-Anwendungen mit Visual Studio und den No...
JavaScript goes Enterprise - Node.js-Anwendungen mit Visual Studio und den No...
 
Ruby on Rails in a metro session
Ruby on Rails in a metro sessionRuby on Rails in a metro session
Ruby on Rails in a metro session
 
Gradle - Beginner's Workshop (german)
Gradle - Beginner's Workshop (german)Gradle - Beginner's Workshop (german)
Gradle - Beginner's Workshop (german)
 
JavaScript für Java-Entwickler W-JAX 2013
JavaScript für Java-Entwickler W-JAX 2013JavaScript für Java-Entwickler W-JAX 2013
JavaScript für Java-Entwickler W-JAX 2013
 
Desktop Containers 12: Next Generation of ZENworks Application Virtualization
Desktop Containers 12: Next Generation of ZENworks Application VirtualizationDesktop Containers 12: Next Generation of ZENworks Application Virtualization
Desktop Containers 12: Next Generation of ZENworks Application Virtualization
 
JavaScript goes Enterprise - Node.js-Anwendungen mit Visual Studio und den No...
JavaScript goes Enterprise - Node.js-Anwendungen mit Visual Studio und den No...JavaScript goes Enterprise - Node.js-Anwendungen mit Visual Studio und den No...
JavaScript goes Enterprise - Node.js-Anwendungen mit Visual Studio und den No...
 
Continuous Delivery für Cloud-native Anwendungen auf Cloud-nativer Infrastruktur
Continuous Delivery für Cloud-native Anwendungen auf Cloud-nativer InfrastrukturContinuous Delivery für Cloud-native Anwendungen auf Cloud-nativer Infrastruktur
Continuous Delivery für Cloud-native Anwendungen auf Cloud-nativer Infrastruktur
 
digitalSTROM Developer Day 2011: Jump Start in die digitalSTROM-Server Entwic...
digitalSTROM Developer Day 2011: Jump Start in die digitalSTROM-Server Entwic...digitalSTROM Developer Day 2011: Jump Start in die digitalSTROM-Server Entwic...
digitalSTROM Developer Day 2011: Jump Start in die digitalSTROM-Server Entwic...
 
Robuste Design Systems mit Storybook und Angular: vom Konzept zur lebendigen ...
Robuste Design Systems mit Storybook und Angular: vom Konzept zur lebendigen ...Robuste Design Systems mit Storybook und Angular: vom Konzept zur lebendigen ...
Robuste Design Systems mit Storybook und Angular: vom Konzept zur lebendigen ...
 
"git.net" gibt's nicht?
"git.net" gibt's nicht?"git.net" gibt's nicht?
"git.net" gibt's nicht?
 
Ruby on Rails - Eine kurze Einführung
Ruby on Rails - Eine kurze EinführungRuby on Rails - Eine kurze Einführung
Ruby on Rails - Eine kurze Einführung
 
openHAB @ rheinJUG Düsseldorf
openHAB @ rheinJUG DüsseldorfopenHAB @ rheinJUG Düsseldorf
openHAB @ rheinJUG Düsseldorf
 
Deployment von Entwicklungsumgebungen eines TYPO3-Intranets mit Vagrant
Deployment von Entwicklungsumgebungen eines TYPO3-Intranets mit VagrantDeployment von Entwicklungsumgebungen eines TYPO3-Intranets mit Vagrant
Deployment von Entwicklungsumgebungen eines TYPO3-Intranets mit Vagrant
 
Icinga 2009 at Nagios Workshop
Icinga 2009 at Nagios WorkshopIcinga 2009 at Nagios Workshop
Icinga 2009 at Nagios Workshop
 
Foreman: Docker Integration (Webinar vom 05. Oktober_2016)
Foreman: Docker Integration (Webinar vom 05. Oktober_2016)Foreman: Docker Integration (Webinar vom 05. Oktober_2016)
Foreman: Docker Integration (Webinar vom 05. Oktober_2016)
 
OSMC 2011 | Collectd in der großen weiten Welt - Anbindung des Datensammlers ...
OSMC 2011 | Collectd in der großen weiten Welt - Anbindung des Datensammlers ...OSMC 2011 | Collectd in der großen weiten Welt - Anbindung des Datensammlers ...
OSMC 2011 | Collectd in der großen weiten Welt - Anbindung des Datensammlers ...
 

Plus de Jörn Dinkla

Presentation of the book "Mikado Method"
Presentation of the book "Mikado Method"Presentation of the book "Mikado Method"
Presentation of the book "Mikado Method"Jörn Dinkla
 
Korrekte nebenläufige Anwendungen mit Koroutinen und TDD
Korrekte nebenläufige Anwendungen mit Koroutinen und TDDKorrekte nebenläufige Anwendungen mit Koroutinen und TDD
Korrekte nebenläufige Anwendungen mit Koroutinen und TDDJörn Dinkla
 
Nebenlaeufigkeit mit Koroutinen strukturieren
Nebenlaeufigkeit mit Koroutinen strukturierenNebenlaeufigkeit mit Koroutinen strukturieren
Nebenlaeufigkeit mit Koroutinen strukturierenJörn Dinkla
 
Plain react, hooks and/or Redux ?
Plain react, hooks and/or Redux ?Plain react, hooks and/or Redux ?
Plain react, hooks and/or Redux ?Jörn Dinkla
 
A short introduction to Kotlin
A short introduction to KotlinA short introduction to Kotlin
A short introduction to KotlinJörn Dinkla
 
Concurrency in Kotlin with coroutines
Concurrency in Kotlin with coroutinesConcurrency in Kotlin with coroutines
Concurrency in Kotlin with coroutinesJörn Dinkla
 
Nebenläufigkeit mit Kotlins Koroutinen
Nebenläufigkeit mit Kotlins KoroutinenNebenläufigkeit mit Kotlins Koroutinen
Nebenläufigkeit mit Kotlins KoroutinenJörn Dinkla
 
GPU-Computing mit CUDA und OpenCL
GPU-Computing mit CUDA und OpenCLGPU-Computing mit CUDA und OpenCL
GPU-Computing mit CUDA und OpenCLJörn Dinkla
 
Schulung: Einführung in das GPU-Computing mit NVIDIA CUDA
Schulung: Einführung in das GPU-Computing mit NVIDIA CUDASchulung: Einführung in das GPU-Computing mit NVIDIA CUDA
Schulung: Einführung in das GPU-Computing mit NVIDIA CUDAJörn Dinkla
 
Die ‚komplexe‘ Perspektive - Einführung in die digitale Wirtschaft
Die ‚komplexe‘ Perspektive - Einführung in die digitale WirtschaftDie ‚komplexe‘ Perspektive - Einführung in die digitale Wirtschaft
Die ‚komplexe‘ Perspektive - Einführung in die digitale WirtschaftJörn Dinkla
 
Geschäftsmodelle - Ein kurzer Überblick
Geschäftsmodelle -Ein kurzer ÜberblickGeschäftsmodelle -Ein kurzer Überblick
Geschäftsmodelle - Ein kurzer ÜberblickJörn Dinkla
 
Buchvorstellung "Libertarian Anarchy: Against the State" von Gerard Casey
Buchvorstellung "Libertarian Anarchy: Against the State" von Gerard CaseyBuchvorstellung "Libertarian Anarchy: Against the State" von Gerard Casey
Buchvorstellung "Libertarian Anarchy: Against the State" von Gerard CaseyJörn Dinkla
 
Multi-GPU-Computing: Eins, zwei, drei, ganz viele
Multi-GPU-Computing: Eins, zwei, drei, ganz vieleMulti-GPU-Computing: Eins, zwei, drei, ganz viele
Multi-GPU-Computing: Eins, zwei, drei, ganz vieleJörn Dinkla
 
Tipps & Tricks für den erfolgreichen Einsatz von GPU-Computing
Tipps & Tricks für den erfolgreichen Einsatz von GPU-ComputingTipps & Tricks für den erfolgreichen Einsatz von GPU-Computing
Tipps & Tricks für den erfolgreichen Einsatz von GPU-ComputingJörn Dinkla
 
GPU-Computing mit CUDA und OpenCL in der Praxis
GPU-Computing mit CUDA und OpenCL in der PraxisGPU-Computing mit CUDA und OpenCL in der Praxis
GPU-Computing mit CUDA und OpenCL in der PraxisJörn Dinkla
 
Introduction To Parallel Computing
Introduction To Parallel ComputingIntroduction To Parallel Computing
Introduction To Parallel ComputingJörn Dinkla
 

Plus de Jörn Dinkla (16)

Presentation of the book "Mikado Method"
Presentation of the book "Mikado Method"Presentation of the book "Mikado Method"
Presentation of the book "Mikado Method"
 
Korrekte nebenläufige Anwendungen mit Koroutinen und TDD
Korrekte nebenläufige Anwendungen mit Koroutinen und TDDKorrekte nebenläufige Anwendungen mit Koroutinen und TDD
Korrekte nebenläufige Anwendungen mit Koroutinen und TDD
 
Nebenlaeufigkeit mit Koroutinen strukturieren
Nebenlaeufigkeit mit Koroutinen strukturierenNebenlaeufigkeit mit Koroutinen strukturieren
Nebenlaeufigkeit mit Koroutinen strukturieren
 
Plain react, hooks and/or Redux ?
Plain react, hooks and/or Redux ?Plain react, hooks and/or Redux ?
Plain react, hooks and/or Redux ?
 
A short introduction to Kotlin
A short introduction to KotlinA short introduction to Kotlin
A short introduction to Kotlin
 
Concurrency in Kotlin with coroutines
Concurrency in Kotlin with coroutinesConcurrency in Kotlin with coroutines
Concurrency in Kotlin with coroutines
 
Nebenläufigkeit mit Kotlins Koroutinen
Nebenläufigkeit mit Kotlins KoroutinenNebenläufigkeit mit Kotlins Koroutinen
Nebenläufigkeit mit Kotlins Koroutinen
 
GPU-Computing mit CUDA und OpenCL
GPU-Computing mit CUDA und OpenCLGPU-Computing mit CUDA und OpenCL
GPU-Computing mit CUDA und OpenCL
 
Schulung: Einführung in das GPU-Computing mit NVIDIA CUDA
Schulung: Einführung in das GPU-Computing mit NVIDIA CUDASchulung: Einführung in das GPU-Computing mit NVIDIA CUDA
Schulung: Einführung in das GPU-Computing mit NVIDIA CUDA
 
Die ‚komplexe‘ Perspektive - Einführung in die digitale Wirtschaft
Die ‚komplexe‘ Perspektive - Einführung in die digitale WirtschaftDie ‚komplexe‘ Perspektive - Einführung in die digitale Wirtschaft
Die ‚komplexe‘ Perspektive - Einführung in die digitale Wirtschaft
 
Geschäftsmodelle - Ein kurzer Überblick
Geschäftsmodelle -Ein kurzer ÜberblickGeschäftsmodelle -Ein kurzer Überblick
Geschäftsmodelle - Ein kurzer Überblick
 
Buchvorstellung "Libertarian Anarchy: Against the State" von Gerard Casey
Buchvorstellung "Libertarian Anarchy: Against the State" von Gerard CaseyBuchvorstellung "Libertarian Anarchy: Against the State" von Gerard Casey
Buchvorstellung "Libertarian Anarchy: Against the State" von Gerard Casey
 
Multi-GPU-Computing: Eins, zwei, drei, ganz viele
Multi-GPU-Computing: Eins, zwei, drei, ganz vieleMulti-GPU-Computing: Eins, zwei, drei, ganz viele
Multi-GPU-Computing: Eins, zwei, drei, ganz viele
 
Tipps & Tricks für den erfolgreichen Einsatz von GPU-Computing
Tipps & Tricks für den erfolgreichen Einsatz von GPU-ComputingTipps & Tricks für den erfolgreichen Einsatz von GPU-Computing
Tipps & Tricks für den erfolgreichen Einsatz von GPU-Computing
 
GPU-Computing mit CUDA und OpenCL in der Praxis
GPU-Computing mit CUDA und OpenCL in der PraxisGPU-Computing mit CUDA und OpenCL in der Praxis
GPU-Computing mit CUDA und OpenCL in der Praxis
 
Introduction To Parallel Computing
Introduction To Parallel ComputingIntroduction To Parallel Computing
Introduction To Parallel Computing
 

Ant im Detail

  • 1. Schulung „Ant im Detail“ © 2008 - 2009 Jörn Dinkla joern@dinkla.com http://www.dinkla.com © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com
  • 2. Vorstellung • Dipl.-Inform. Jörn Dinkla • Schwerpunkte • Java Entwicklung (J2SE, JEE) • Moderne Programmiersprachen • Groovy, Ruby, Haskell, Scala • Modellgetriebene Entwicklung • Automatisierung • Eclipse-Plugin-Entwicklung • CUDA, OpenCL • Business-Intelligence • Hobbies • Musik, Literatur © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 2
  • 3. Überblick © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com
  • 4. Überblick • Einführung und Kennenlernen • Überblick über Build-Prozesse • Ant-Grundkurs • Java-Projekt zum Kennenlernen • Ant auf der Kommandozeile • Die Datentypen von Ant • Die Tasks von Ant • Ant und IDEs • Ant erweitern • Zwischendurch • Hands-on • Gemeinsam mit Ant entwickeln © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 4
  • 5. Build-Prozesse und -Tools © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com
  • 6. Was ist ein Build-Prozess ? • Von den Artifakten zum installierten Produkt • Graph mit Abhängigkeiten (DAG) • Workflow UML Java XML Generieren JSP Kompilieren ... ... Fehler- Testen Reports Ausführen Installieren Packen © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 6
  • 7. Automatisierung von Build-Prozessen • Warum ? • Zeitersparnis • Es gibt bessere Dinge zu tun • Sicherheit, da manuelle Ausführung fehleranfällig ist • „Durch Langeweile entstehen Fehler“ • Welche Prozesse ? • Daumenregel: Wenn mehr als zweimal durchgeführt • Und man diese genau genug kennt • Welche Arten ? • befehlsgesteuert • zeitgesteuert • ereignisgesteuert © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 7
  • 8. Automatisierung von Build-Prozessen • Wann ? • hängt vom Prozess und der Situation ab • Zeitdauer • die benötigten Ressourcen • Sollten so oft wie möglich laufen • Was wird benötigt ? • Versionsverwaltung • Automatisierte Tests • Skripte (Installation, etc.) • Rückmeldung • Email, Web-Seiten, Lavalampen © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 8
  • 9. Das Ideal: CRISP • CRISP-Builds • vollständig („complete“) • von Grund auf neu erstellt • keine manuell hinzugefügten Dateien • wiederholbar („repeatable“) • durch Versionskontrolle jederzeit konsistent • informativ („informative“) • Gesundheitszustand der Software, Tests • planbar („schedulable“) • Rund um die Uhr lauffähig -> frühe Fehlerentdeckung • portable („portable“) • Keine Abhängigkeiten an speziellen Rechner © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 9
  • 10. Build-Tools • Sind „Programmiersprachen“ für • die Erstellung • und die Ausführung von Build-Prozessen • Die bekanntesten sind • Make • sehr alt (1977, Bell Labs) • sehr viele Varianten • Ant • Maven • MSBuild (VisualStudio) • nur Windows © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 10
  • 11. Make • Tool aus der Unix-Welt • Ursprünglich für die Entwicklung in C • Transformationen von Dateien mit externen Programmen • Daher plattformabhängig • Tab‘s an bestimmten Stellen notwendig • Hier ein Ausschnitt aus dem Manual von GNUmake • „generiert aus *.c Datei ein Makefile *.d“ %.d: %.c @set -e; rm -f $@; $(CC) -M $(CPPFLAGS) $< > $@.$$$$; sed 's,($*).o[ :]*,1.o $@ : ,g' < $@.$$$$ > $@; rm -f $@.$$$$ • siehe http://www.gnu.org/software/make/manual/ make.html © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 11
  • 12. Maven • Ist wie Ant ein Apache-Projekt • „Project management and comprehension tool“ • „comprehension“ = Begreifen, Erfassen, Verstehen • Maven bietet • Einheitliches Build-System • Informations-Infrastruktur • Bibliotheken, Test-Reports, Abhängigkeiten • Richtlinien für „Best Practices“ • Maven erfordert • Einhaltung der „Best practices“ und Projektstruktur • Bei Abweichungen ist viel Arbeit notwendig • Übergang von „Benutzer von Maven“ zu „Plugin- Maintainer“ kann hart und zeitintensiv sein © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 12
  • 13. Ant • Apache Ant (http://ant.apache.org/) • Quasi-Standard in der Java-Welt • Basiert auf abstrakter Sicht • Targets, deren Abhängigkeiten • und Tasks • Pluspunkte • Einfach erweiterbar • Performant • Lebendige Community, Open Source • viele Erweiterungen • Testing integriert • in viele Entwicklungsumgebungen integriert © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 13
  • 14. Möglichkeiten mit Ant • Grundsatz: „Alles, was auf der JVM läuft, läuft mit Ant.“ • Vielzahl an Möglichkeiten mit Ant • Archive • Datenbanken • Dateien • Java • Netzwerk • Prozesse • Softwareentwicklung • Testing • Versionsverwaltung • XML © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 14
  • 15. Möglichkeiten: Archive • Ant kann folgende Formate erstellen und lesen • Zip • Tar • Jar, War, Ear • Rpm • Cab (Microsoft) • Komprimierungsverfahren • Gzip • Bzip2 • Jars können signiert werden © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 15
  • 16. Möglichkeiten: Dateien • Operationen für Dateien und Verzeichnisse • Anlegen, Löschen, Kopieren, Bewegen, Umbenennen, Konkatenieren • Transformieren • String-Ersetzungen • Ersetzung mit regulären Ausdrücken • Komprimieren • Checksummen, z. B. MD5 • Zugriffsrechte, Benutzer und Gruppen • Patch © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 16
  • 17. Möglichkeiten: Java • Kompilieren • Sun, Jikes, MS, Kopi, GCJ, Symantec • Jar, War und Ear-Archive erstellen • inkl. Erstellung von MANIFEST.MF • Java-Klassen ausführen • JUnit-Tests durchführen • HTML-Reports erstellen • Javadoc erzeugen • Verschiedenes • Dependencies (JDepend) • Apt (Annotation Processor Tool) • Rmic (Java RMI stub compiler) © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 17
  • 18. Möglichkeiten: Netzwerk • Ant kann die meisten Netzwerkprotokolle. • Zugriff auf Sockets • FTP • HTML Get, Post • Testen: HTML-Clients für JUnit • Email • scp • Prozesse mit ssh ausführen • Rexec (remote execution) • Telnet • WebDAV © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 18
  • 19. Möglichkeiten: Softwareentwicklung • Support für „Skriptsprachen“ • JavaScript, AWK, Groovy, Haskell, Python, Ruby, Scheme, Tcl, BeanShell, JLog, NetRexx, Scala, XSLT und viele mehr • Parsergeneratoren • ANTLR, JavaCC • Code-Qualität • Checkstyle, PMD, Findbugs, JavaNCSS • Generierung • XDoclet • J(2)EE • verschiedene Applikationsserver, Apache Tomcat • EJB2 © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 19
  • 20. Möglichkeiten: Testing • Allgemein • JUnit („ist integriert“), 3.8 vs. 4.0 • Cobertura (Testabdeckung) • JMeter (Performance und Lasttest) • TestNG, Fitnesse • Datenbank • DbUnit (Datenbank) • Applikation Server • JUnitEE • Apache Cactus • Web • HtmlUnit, HttpUnit, Canoo Web Test • XMLUnit © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 20
  • 21. Möglichkeiten: Prozesse • Prozesskontrolle • Externe Prozesse • Aufruf von Shell-Kommandos • Mächtig, aber nicht platformunabhängig • Java-Klassen ausführen • können Ant-Prozess überdauern • Ant-Build-Prozesse • Aufruf von anderen Ant-Build-Skripts • Import von Definitionen © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 21
  • 22. Möglichkeiten: Verschiedenes • Datenbanken • Die Anbindung erfolgt über JDBC • SQL Statements absetzen • Management von Java-Bibliotheken • Ivy • Funktionalität ähnlich Maven © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 22
  • 23. Möglichkeiten: Versionsverwaltung • Versionsverwaltungen • CVS • Subversion (SVN) • ClearCase™ • Continuus™ • Perforce™ • PVCS™ • StarTeam™ • VisualSourceSafe™ • CVS und Subversion sind Open Source. © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 23
  • 24. Möglichkeiten: XML • XML • XML Dateien erstellen • XML-Dateien transformieren • XSLT • Validierung • Nach DTD • Nach XML-Schema © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 24
  • 25. Ant-Grundlagen © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com
  • 26. Apache Ant • Ant-Dateien sind in XML geschrieben. • Default: build.xml. <?xml version="1.0"?> <project name="Tutorial" Projekt default="build"> Target <target name="build"> <echo message="Hallo Welt!" /> Task <echo message="Hallo, nochmal" /> </target> Task </project> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 26
  • 27. Erinnerung: XML • XML • Elemente („tags“) und Attribute • Starttags und Endtags, verkürzter Endtag ‚/>‘ • Hierarchie mit Baumstruktur • DOM „document object model“ • <project name="Tutorial" default="build"> <target name="build"> <echo message="Hallo Welt!" /> <echo message="Hallo, nochmal" /> </target> </project> Elemente Attribute © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 27
  • 28. Erinnerung: XML-Baumstruktur • <project name="Tutorial" default="build"> <target name="build"> <echo message="Hallo Welt!" /> <echo message="Hallo, nochmal" /> </target> </project> project name=“Tutorial “ target name=“build echo echo message=“Hallo, Welt“ message=“Hallo, © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 28
  • 29. Ausführen des Beispiels • Ausführen des Skripts. • -f gibt den Dateinamen an, Default ist: build.xml • Informationen: • Build-Datei, Targets, Tasks („[echo]“), Status, Dauer © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 29
  • 30. Aufbau • In einem Build-File befindet sich ein Projekt • Projekte können andere Projekte importieren • Ein Projekt besteht aus Targets • Targets können voneinander abhängig sein • Ein Target besteht aus Tasks • Sequentielle oder parallele Abarbeitung • Ein Task wird in einer Java-Klasse implementiert. • deshalb ist Ant erweiterbar • „dynamic XML binding“ © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 30
  • 31. Beispiel für Aufbau <?xml version="1.0"?> <project name="Tutorial" default="all"> Projekt <target name="hallo"> Target <echo message="Hallo Welt!" /> </target> Task <target name="ende"> Target <echo message="Ende Welt!" /> </target> Task <target name="all" depends="hallo, ende" /> Target </project> • Attribut default definiert Default-Target • Attribut depends definiert Abhängigkeiten © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 31
  • 32. Abhängigkeiten • Targets können als Argument übergeben werden © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 32
  • 33. Abhängigkeiten und Ausführung • Abhängigkeiten sind transitiv • Wenn a von b abhängt und b von c, • dann hängt a auch von c ab. • a ← b und b ← c, dann a ← c • Die Bestimmung der Reihenfolge • geschieht einmalig am Anfang • topologische Sortierung eines DAGs © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 33
  • 34. Abhängigkeiten visualisieren • Abhängigkeiten können komplex werden • Tools, um Ant-Projektdateien zu visualisieren • Nicht editieren! • Linguine Maps • yEd © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 34
  • 35. Komplexe Abhängigkeiten • Abhängigkeiten können komplex werden. • Siehe die Build-Datei von Hibernate 3.0 © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 35
  • 36. Beispiel für Abhängigkeiten <target name="a"> <echo>a</echo></target> <target name="b" depends="a"> <echo>b</echo></target> <target name="c1" depends="b"> <echo>c1</echo></target> <target name="c2" depends="a,b"> <echo>c2</echo></target> <target name="c3" depends="b,a"> <echo>c3</echo></target> <target name="d" depends="c2,c1,c3"> <echo>d</echo></target> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 36
  • 37. Beispiel für Abhängigkeiten • $ ant c1 • ➙ a, b, c1 • $ ant c2 • ➙ a, b, c2 • $ ant c3 • ➙ a, b, c3 • $ ant d • ➙ a, b, c2, c1, c3, d • Aber bei mehreren Targets: • $ ant b a • ➙ a, b, a © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 37
  • 38. Mehr als ein Target als Argument • Bei mehreren Targets auf der Kommandozeile aufpassen ! © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 38
  • 39. Abhängigkeiten und Ausführung • Aus historischen Gründen (Kompatibilität) • Mehrere Targets auf der Kommandozeile werden einzeln ausgeführt • Deshalb ruft •$ ant b a • zuerst b auf (erstes Argument) • Dieses hängt von a ab. • Daher wird a aufgerufen. • Dann wird b ausgeführt. • Dann kommt das zweite Argument a. • Daher wird a noch einmal aufgerufen. • Sequenz: a, b, a © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 39
  • 40. Ant Grundkurs - Beispiel © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com
  • 41. Eine Beispielanwendung • Sehr, sehr einfache Version des „Doktors“ des Emacs- Editors • Gibt nur einen zufälligen String zurück © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 41
  • 42. Verzeichnisstruktur • Die Projektstruktur • build.xml in der Wurzel • Sourcen in src • Tests in test • Bibliotheken in lib • Klassen in build/classes • Jar in build • Distribution in dist © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 42
  • 43. Der Build-Prozess • Build-Prozess für einfaches Java-Projekt. • Targets • Clean zum Saubermachen • Init • Compile • Execute • JUnit • Jar • Dokumentation mit Javadoc • Packeterstellung mit zip • Deployment mit Ftp © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 43
  • 44. Verzeichnisse anlegen und löschen • Verzeichnisse können mit mkdir angelegt werden. <project name="project" default="compile"> <target name="init"> <mkdir dir="build"/> <mkdir dir="build/classes"/> </target> • Mit delete können sie wieder entfernt werden. <target name="clean"> <delete dir="build"/> </target> </project> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 44
  • 45. Java kompilieren • Mit javac können Java-Dateien kompiliert werden. <target name="compile" depends="init"> <javac srcdir="src" destdir="build/classes"/> </target> • Das Attribut srcdir gibt das Quellverzeichnis an. • Alle *.java Dateien werden kompiliert • Auch in Unterverzeichnissen • Das Attribut destdir gibt das Ziel für die *.class Dateien an. • Das build-Verzeichnis wird benötigt. • Deshalb abhängig von init. © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 45
  • 46. Java ausführen • Zum Testen einfacher Anwendungen nützlich • <target name="execute" depends="compile"> <java classname="beispiel.Doctor" classpath="build/classes"/> </target> • Target ist abhängig von der Kompilierung • Das Attribut classname bestimmt die Klasse, deren main()- Methode aufgerufen wird. • Das Klassenpfad wird mit classpath bestimmt. © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 46
  • 47. Im Überblick <project name="project" default="compile"> <target name="clean"> <delete dir="build"/> Säubern </target> <target name="init" depends="clean" > <mkdir dir="build"/> Verzeichnisse <mkdir dir="build/classes"/> </target> <target name="compile" depends="init"> Kompilieren <javac srcdir="src" destdir="build/classes"/> </target> <target name="execute" depends="compile"> <java classname="beispiel.Doctor" classpath="build/classes"/> Ausführen </target> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 47
  • 48. Redundanzen und DRY <project name="project" default="compile"> <target name="clean"> <delete dir="build"/> </target> <target name="init" depends="clean" > <mkdir dir="build"/> <mkdir dir="build/classes"/> </target> <target name="compile" depends="init"> <javac srcdir="src" destdir="build/classes"/> </target> <target name="execute" depends="compile"> <java classname="beispiel.Doctor" classpath="build/classes"/> </target> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 48
  • 49. Lösung: Properties <property name="build.dir" location="build"/> <property name="classes.dir" value="build/classes"/> <target name="clean"> <delete dir="${build.dir}"/> </target> <target name="init"> <mkdir dir="${build.dir}"/> <mkdir dir="${classes.dir}"/> </target> <target name="compile" depends="init"> <javac srcdir="src" destdir="${classes.dir}"/> </target> <target name="execute" depends="compile"> <java classname="beispiel.Doctor" classpath="${classes.dir}"/> </target> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 49
  • 50. Properties <property name="build.dir" location="build"/> <property name="classes.dir" value="build/classes"/> • location ermittelt die vollen Pfadnamen • Bei value wird der Wert selbst genommen • Properties sind Konstanten • Einmal gesetzt, ändern sie sich nicht mehr • Ermöglich Steuerung des Skripts von außen •$ ant -f build1.xml -Dbuild.dir=bauverzeichnis • Erstellt die Dateien im Verzeichnis bauverzeichnis • Properties können auch aus Property-Dateien gelesen werden • ... später mehr dazu ... © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 50
  • 51. JUnit-Tests • Wir müssen jetzt die Dateien in src und test kompilieren. • Wir benötigen die JUnit-Jar-Datei. © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 51
  • 52. JUnit-Tests • Wir führen einen Pfad path ein. <property name="test.dir" value="test" /> <path id="path.compile"> <path location="${classes.dir}"/> <path location="lib/junit-3.8.1.jar"/> </path> • Ein Pfad ist ein Datentyp von Ant (später mehr). • Der Pfad besteht aus dem Verzeichnis für die Klassen und der JUnit-Jar-Datei. © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 52
  • 53. JUnit-Tests • Diesen definierten Pfad benutzen wir im javac-Task mit refid. <target name="compile" depends="init"> <javac srcdir="${src.dir}:${test.dir}" destdir="${classes.dir}"> <classpath refid="path.compile"/> </javac> </target> • In srcdir werden die Properties mit einem Doppelpunkt getrennt. © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 53
  • 54. Kompilieren in src und test • Wir überprüfen die Änderungen • Es werden drei Dateien kompiliert, richtig. © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 54
  • 55. JUnit-Test-Task im Überblick • Den Pfad benutzen wir wieder. <target name="junit" depends="compile"> <junit> <classpath refid="path.compile" /> <formatter type="brief" usefile="false"/> <batchtest todir="."> <fileset dir="${classes.dir}"> <include name="**/*Test.class" /> <exclude name="**/Abstract*Test.class" /> </fileset> </batchtest> </junit> </target> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 55
  • 56. JUnit-Tests • Für den formatter gibt es: brief und xml. <formatter type="brief" usefile="false"/> • Batchtest führt mehrere Tests aus. <batchtest todir="."> <fileset dir="${classes.dir}"> <include name="**/*Test.class" /> </fileset> </batchtest> • Ein Fileset ist eine ungeordnete Menge von Dateien. • Muster mit include und exclude • ... später dazu mehr ... © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 56
  • 57. JUnit-Tests • JUnit meldet einen Fehler, Ant meldet SUCCESSFUL • Aber: Bugs sollen nicht ausgeliefert werden! © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 57
  • 58. JUnit-Tests • Wir müssen dem JUnit-Task mitteilen, welches Property er bei einem Error oder bei einer Failure setzen soll. <target name="junit" depends="compile"> <junit errorproperty="test.failed" failureproperty="test.failed"> ... </junit> <fail message="JUnit tests failed!" if="test.failed" /> </target> • Anschliessend wird der Task fail benutzt, falls das Property gesetzt ist. • Bedingte Ausführung von Tasks mit if und unless. • Damit ist der Build gescheitert. © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 58
  • 59. Versagen erwünscht • Das ist das gewünschte Ergebnis. © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 59
  • 60. JUnit-Tests • Wir möchten auch einen HTML-Report des JUnit-Tests. • Wir benötigen ein Verzeichnis für die Dateien. <property name="junit.dir" value="junit" /> • Wir benutzen den XML-Formatter und schreiben in dieses Verzeichnis. ... <formatter type="xml"/> <batchtest todir="${junit.dir}"> ... © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 60
  • 61. JUnit-Tests • Der JUnit-Prozess schreibt für jede Testklasse eine XML- Datei TEST-Klassenname.xml. • Hieraus erzeugen wir einen HTML-Report. <junitreport todir="${junit.dir}"> <fileset dir="${junit.dir}"> <include name="TEST-*.xml" /> </fileset> <report format="frames" todir="${junit.dir}" /> </junitreport> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 61
  • 62. JUnit-Tests • Das Testergebnis. © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 62
  • 63. Dateien ignorieren • Wir können den BrokenDoctorTest vom JUnit-Test ausschließen. • Hierzu wird im Fileset exclude verwendet. <batchtest todir="."> <fileset dir="${classes.dir}"> <include name="**/*Test.class" /> <exclude name="**/Broken*Test.class" /> </fileset> </batchtest> • Nur zur Demonstration. In der Realität sollte man keine Testfälle einfach ausschließen. © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 63
  • 64. Der JUnit-Test ist ok • Es ist jetzt alles wieder ok. © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 64
  • 65. Erstellen einer Jar-Datei • Eine Jar-Datei kann mit dem Task <jar> erstellt werden <property name="dest.name" value="doctor-0.1" /> ... <target name="jar" depends="junit"> <jar destfile="${build.dir}/${dest.name}.jar" basedir="${classes.dir}"> <manifest> <attribute name="Main-Class" value="beispiel.Doctor" /> </manifest> </target> • Die Main-Klasse wird extra angegeben. • Bevor dieser Task läuft, muss der JUnit-Test gefixt werden. © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 65
  • 66. Dokumentation • Wir benötigen Dokumentation. <property name="doc.dir" value="doc" /> • Wir müssen das Quellverzeichnis, das Zielverzeichnis und den Klassenpfad angeben. <target name="doc" depends="compile"> <javadoc destdir="${doc.dir}" sourcepath="${src.dir}" charset="UTF-8" docencoding="UTF-8"> <classpath refid="path.compile" /> </javadoc> </target> • Umlaute in UTF-8 © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 66
  • 67. Dokumentation • Die Javadoc. © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 67
  • 68. Erstellen der Distribution • Wir erstellen eine Zip-Datei mit Jar und Dokumentation <property name="dest.name" value="doctor-0.1" /> <zip destfile="${dest.name}.zip"> <zipfileset file="${build.dir}/${dest.jar}" prefix="${dest.name}" /> Jar <zipfileset dir="${doc.dir}" prefix="${dest.name}/doc"> <include name="**/*.*"/> </zipfileset> Doc </zip> • Zipfileset ist eine Erweiterung von Fileset. • Hier kann mit prefix das Verzeichnis bestimmt werden. © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 68
  • 69. Erstellen der Distribution • Wir machen den Task abhängig von doc und jar <target name="zip" depends="doc, jar"> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 69
  • 70. Upload der Distribution • Mit FTP stellen wir die neueste Version zur Verfügung. <target name="deploy" depends="zip"> <ftp server="${server}" userid="${user}" password="${password}" action="put" remotedir="."> <fileset file="${dist.dir}/${dest.name}.zip" /> </ftp> </target> • Die Aktionen werden in action definiert: put, get, del, ... • Hier wird ein Fileset verwendet, dass nur aus einer Datei besteht. © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 70
  • 71. Upload der Distribution • Ausführen ergibt allerdings einen Fehler. • FTP ist ein„optionaler Task“, wir benötigen eine zusätzliche Jar-Datei. • $ ant deploy -lib lib/commons-net-1.4.0.jar © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 71
  • 72. Der gesamte Prozess © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 72
  • 73. Ant-Skripte dokumentieren • Ein Projekt wird im Element description erläutert. <project name="beispiel"> <description> Beschreibung des Projekts. </description> • Targets und Tasks lassen sich mit dem description- Attribut dokumentieren. <target name="test" description="Führe den Test durch"...> • Die Informationen für das Projekt und die Targets werden mit projecthelp angezeigt. © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 73
  • 74. Ant auf der Kommandozeile © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com
  • 75. Ant auf der Kommandozeile • Viele IDEs unterstützen Ant • Aber: • Auch hier müssen Argumente angeben werden. • Darum: • Die wichtigsten sollte man kennen. • Der Aufruf von Ant hat die folgende Syntax. $ ant [options] [target [target2 [target3] ...]] • Beispiel $ ant -f b.xml -emacs -Dsrc.dir=src2 compile zip © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 75
  • 76. Optionen: Informationen • Die folgenden Optionen sind beim Debuggen hilfreich. -help -h Hilfe zu den Optionen -version Versionsinformationen -verbose -v Ausführlichere Informationen -diagnostics Listet Properties, Jar-Dateien, etc. -projecthelp -p Kurzinformationen -emacs Unterdrückt „[Taskname]“ -debug -d Ausführliche Informationen -logfile FILE Ausgabe in Datei -logger CLASS Ein anderer Logger © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 76
  • 77. Optionen: Anpassungen • Die folgenden Optionen sind Anpassungen. -buildfile FILE -f Benutzt eine andere Build-Datei -Dproperty=value Setzt das Property auf den Wert -propertyfile FL Benutzt Properties aus Datei -lib FILE Fügt Datei dem Klassenpfad hinzu -noinput Keine Eingabe -quiet Nur Fehler werden berichtet -keep-going -k Macht weiter nach Fehlern © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 77
  • 78. Optionen: Anpassungen • Die folgenden Optionen sind weitere Anpassungen. -nouserlib Ignoriert $HOME/.ant/lib -noclasspath Ignoriert CLASSPATH Umgeb.var. -autoproxy Benutzt die Netzwerkeinstellung für Proxies des Betriebssystems(Java 1.5) -inputhandler CL Die Klasse, die auf <input>-Events reagieren soll -listener CL Ein Listener, z. B. für Continous- Integration-Tools -main CL Alternative Klasse für Ant © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 78
  • 79. Installation von Ant • Java Software Development Kit (SDK) wird benötigt • Umgebungsvariable JAVA_HOME muss gesetzt sein • PATH um $JAVA_HOME/bin erweitern • Download von http://ant.apache.org • Die aktuelle Version ist 1.7.1. • Entpacken in Verzeichnis ohne Leerzeichen • Umgebungsvariable ANT_HOME muss gesetzt sein • PATH um $ANT_HOME/bin erweitern • Sicherstellen, dass CLASSPATH nicht gesetzt ist • Das kann später Fehler verursachen • Optional: • Anpassung mit ANT_OPTS und ANT_ARGS © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 79
  • 80. Die Datentypen von Ant © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com
  • 81. Motivierendes Beispiel • Ein Blick in die Dokumentation ... © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 81
  • 82. Unbekannte Fachbegriffe • Was bedeuten diese Begriffe ? • „patterns“ • „directory based tasks“ • „fileset“ • „implicit fileset“ • „nested include/exclude elements“ • „nested patternset elements“ • „nested filesets“ • „extended fileset elements“ • „extended groupfileset elements“ • Fazit: Wir benötigen mehr Grundwissen über Ant ! © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 82
  • 83. Datentypen • Projekt • Targets • Tasks • Parameter von Tasks • Diese Parameter haben einen Datentyp. • Datatypes / Datentypen • Das Datenmodell ist gewachsen • Abwärtskompatibilität • Nicht immer einheitlich • Sind in Java-Klassen implementiert. © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 83
  • 84. Datatypes / Datentypen • Datentypen • Properties und PropertySets • Resources und Resource Collections • Path, FileSet, FileList, DirSet, TarFileSet, ZipFileSet • Auswahl von Dateien • Dateinamen: PatternSet • Eigenschaften: Selektoren • Transformationen • Dateinamen: FileMapper • Inhalt: FilterSet, FilterChains und FilterReader • Weitere: • Permissions, Directory-Based Tasks • I/O-Redirectors, Regexp, XMLCatalog © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 84
  • 85. Properties • Kennen wir aus dem „Grundkurs“ • Properties haben einen Namen und enthalten Strings. • Derefenzierung mit ${propertyName} • Properties sind Konstanten • Einmal gesetzt, ändern sie sich nicht mehr • Werden zur Ablaufsteuerung benutzt. • Falls eine Property keinen Wert besitzt, wird sie als $ {propertyName} ausgegeben. <echo>${nochNichtDefiniert}</echo> • ergibt ${nochNichtDefiniert}. • Es gibt viele vordefinierte Properties. • <echoproperties/> gibt diese aus. © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 85
  • 86. Definieren von Properties • Properties können gesetzt werden. Der Wert ist nicht änderbar. <property name="sprachen" value="Ant und Java"/> • Mit werden Dateien und Pfade zu absoluten Pfaden umgewandelt (wenn sie nicht im basedir liegen). <property name="build.dir" location="build"/> • Properties können bei der Definition von Properties verwendet werden. <property name="classes.dir" location="${build.dir}/classes"/> • Properties können aus Properties-Dateien geladen werden. <property file="build.properties"/> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 86
  • 87. Definieren von Properties • Auch in den Properties-Dateien, können Properties in Definitionen verwendet werden. build.dir=build classes.dir=${build.dir}/classes dist.name=doctor-0.1 dist.jar=${dist.name}.jar • Diese werden wie die mit value definierten behandelt. • Umgebungsvariablen können als Properties geladen werden. <property environment="env"/> • Zugriff mit env.VARIABLE, zum Beispiel. <echo>env.LANG=${env.LANG}</echo> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 87
  • 88. Steuerung mit Properties: <available> • Der <available> Task setzt eine Property, wenn eine spezifizierte Ressource vorhanden ist. • Klassen, Dateien, Verzeichnisse, JVM-Ressourcen • <available property="istDa1" classname="java.lang.String"/> <available property="istDa2" classname="java.lang.Xtring"/> <echo>${istDa1}, ${istDa2}</echo> • Ergibt true, ${istDa2} • <available property="istDa" file="a.txt" type="file"/> • <available property="istDa" file="/usr/local/lib" type="dir"/> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 88
  • 89. Steuerung mit Properties: • Der <condition> Task setzt eine Property, wenn die angegebene Bedingung zutrifft. • Der Task hat die folgenden Attribute • Das zu setzende property • Den Wert value • Den Wert else, der ansonsten zugewiesen wird • Beispiel • <condition property="c1" else="X" > <equals arg1="1" arg2="0"/> </condition> • ergibt X © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 89
  • 90. Steuerung mit Properties: • Bedingungen können geschachtelt werden. • <condition property="c2" value="Y"> <or> <equals arg1="1" arg2="0"/> <not> <equals arg1="1" arg2="0"/> </not> </or> </condition> • Ergibt Y © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 90
  • 91. Steuerung mit Properties: • Ein Auswahl von „core conditions“ <and>, <or>, <not>, <xor> Logische Verknüpfungen <isset>, <isreference> Ist gesetzt? <istrue>, <isfalse> Ist wahr, Ist falsch ? <equals> Sind zwei Strings gleich ? <contains> Ist String enthalten <matches> Reguläre Ausdruck <available> Wie der Task <filesmatch> Dateivergleich <isfileselected> Wurde Datei selektiert ? <socket>, <http> Ist erreichbar ? © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 91
  • 92. PropertySet • Properties können zu einem PropertySet zusammengefasst werden • Seit Ant Version 1.6 • Eher Ant-Intern • Eventuell für einen eigenen Tasks verwendbar • Im allgemeinen nicht für Build-Prozesse © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 92
  • 93. Properties und Boolesche Werte • Ein Property kann einen Booleschen Wert darstellen. • Wahr sind • true • yes • on • Falsch sind • false • no • off © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 93
  • 94. Resource und Resource Collections • Resourcen sind „Datei-ähnliche“ Dinge • resource, file, javaresource, zipentry, tarentry • gzipresource, bzip2resource, url, string, propertyresource • Eine Resource Collection ist eine Menge von Resourcen • File resources • Fileset, Dirset, Filelist • Path • Tarfileset, Zipfileset • PropertySet • Properties © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 94
  • 95. Path / Pfad • Auch „path-like-structure“ genannt • Benutzt für CLASSPATH und PATH Umgebungsvariablen • Geordnete Liste • Elemente sind Dateien und Verzeichnisse • Rekursiv, d.h. ein Pfad kann Unterpfade enthalten • Beispiel für einen Pfad mit einer Datei. <path> <pathelement location="lib/abc.jar"/> </path> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 95
  • 96. Path / Pfad • Beispiel für einen Pfad mit einer Datei und einem Verzeichnis. <path> <pathelement location="lib/abc.jar"/> <pathelement location="build/classes"/> </path> • Kann auch als Unterpfad angegeben werden. <path> <pathelement path="lib/abc.jar:build/classes"/> </path> • Trennung mit Semikolon oder Doppelpunkt • Windows „C:“ wird berücksichtigt • Separatoren: Slash oder Backslash, „/“ oder „“ © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 96
  • 97. Path / Pfad • Abkürzung: Wenn Pfad nur aus einer Location oder einem Pfad besteht. <path location="lib/abc.jar"/> <path path="lib/abc.jar:build/classes"/> • Die bisherigen Beispiele waren „standalone“. • Können nicht wiederverwendet werden. • Mit dem Attribut id kann ein Name zugewiesen werden. <path id="meinpfad"> <pathelement path="lib/abc.jar:build/classes"/> </path> • Mit dem Attribut refid kann er verwendet werden. <path refid="meinpfad"/> • Ist der Pfad unbekannt, bricht Ant mit einem Fehler ab. © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 97
  • 98. Path / Pfad • Pfade können mit Filesets definiert werden. <path> <pathelement path="lib/abc.jar:build/classes"/> <fileset dir="test"> <include name="**/*.txt" </fileset> </path> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 98
  • 99. Fileset • Ungeordnete Liste • wie die mathematische Menge („set“) • Hat ein Verzeichnis als Wurzel • das ist der Hauptunterschied zum Pfad • Per Default enthält es alle Dateien und Unterordner • Inhalt wird bei der ersten Benutzung definiert, nicht bei der Deklaration! • Statisch, werden nicht aktualisiert ! • Umfasst nur bereits existierende Elemente • Ausnahme: die sog. „Defaultexcludes“ © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 99
  • 100. Fileset - Defaultexcludes • Es gibt Dateien, die nicht berücksichtigt werden sollen. • Backup-Kopien, die Editoren automatisch anlegen, *~ • Dateien der Versionskontrolle CVS, .svn • Lösung: defaultexcludes • Folgender Task zeigt die defaultexcludes an. <defaultexcludes echo="true"/> • Die Liste ist änderbar. Sehr umsichtig damit umgehen. Ansonsten „verschwinden“ Dateien. <defaultexcludes add="**/*.bck"/> <defaultexcludes remove="**/*~"/> • Man kann die Voreinstellung wiederherstellen. <defaultexcludes default="true"/> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 100
  • 101. Fileset • Ein Fileset benötigt immer das Attribut dir. <fileset dir="web"/> • Alle Dateien und Unterverzeichnisse von web. • Filesets können auch benannt und wiederverwendet werden. <fileset id="auftritt" dir="web"/> • Filesets können mit Patternsets und mit Selektoren eingeschränkt werden. <fileset dir="web"> <include name=es= "**/*.jsp" /> <contains text="WICHTIG"/> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 101
  • 102. TarFileSet und ZipFileSet • Erweiterung von Fileset für Archive. • Dateien in Archiven haben besondere Eigenschaften. • Entweder das Attribut dir oder src ist notwendig • Bei dir wird wie vorher ein Verzeichnis benutzt • Bei src wird aus einem Archiv benutzt • Attribute • ZipFileSet • prefix, filemode, dirmode, encoding • TarFileSet • prefix, filemode, dirmode, username, group, uid, gid © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 102
  • 103. Filelist und Dirset • Werden nicht so häufig verwendet. • Filelist • Wie Fileset, aber geordnet • Die Elemente müssen nicht existieren • Verwendet in <concat>, <dependset> und <pathconvert> • Als nested element in <path> • Dirset • Wie Fileset, enthält nur Verzeichnisse • Verwendet in <javadoc> und <pathconvert> • Als nested element in <path> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 103
  • 104. Resource Collections • Resource Collections • enthalten 0..* Ressourcen • Es gibt Mengentheoretische Operationen für diese • <intersect> ist die Schnittmenge • <sort> sortiert die Elemente • <union> ist die Vereinigung • <restrict> ist ein Filter • Resource Collections sind noch relativ neu • ab Ant 1.7 • nicht viele Tasks benutzen diese • eher selten in „normalen“ Build-Dateien © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 104
  • 105. Patternset • Ein Patternset ist ein Menge von Mustern (Strings) • Einschränkung eines Filesets nach dem Namen • Stichwort: „file-matching“ • Kann rekursiv weitere Patternsets enthalten • Mögliche Einschränkungen • Include und Exclude • Exklusion vor Inklusion ! • Unterstütze Muster * beliebig viele Zeichen (auch keines) ? Ein einzelnes Zeichen ** beliebig viele Verzeichnisse endet mit / Das gesamte Verzeichnisses mit Inhalt © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 105
  • 106. Patternset • Explizite Verwendung mit patternset. <patternset> <include name="**/*.jsp"/> <exclude name="*Test.jsp"/> </patternset> • Implizite Verwendung im Fileset-Attribut. <fileset dir="lib" includes="*.jsp" /> • Implizite Verwendung als Fileset-Element. <fileset> <include name="*.jsp"/> </fileset> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 106
  • 107. Patternset • Übergabe als Attribute • includes, excludes, includesfile, excludesfile • Übergabe als Element • include, exclude, includesfile, excludesfile • Elemente können Konditional mit if/unless sein • Mit den *file-Versionen wird eine Datei angegeben, die die Muster enthält. <patternset> <include name="**/*.jsp"/> <exclude name="*Test.jsp" if="prod"/> </patternset> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 107
  • 108. Selectors / Selektoren • Einschränkung eines Filesets nach Eigenschaften • Der Selektor wird auf jede Datei angewendet • Können in „selector containers“ angewendet werden. • Es gibt die folgenden Container. <and> Alle Selektoren müssen matchen. <or> Mind. ein Selektor muss matchen. <not> Logisches Nicht für and und or. <none> Kein Selektor matched. <selector> Für Definition mit id. <majority> Mehrheit • Container können verschachtelt werden. • Es können eigene definiert werden („custom selectors“) © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 108
  • 109. Selectors / Selektoren <contains> Enthält die Datei einen best. Text <containsregexp> Enthält die Datei einen reg. Ausdruck <date> Änderungsdatum <depend> Neuer als in 2. Verzeichnis <depth> Verzeichnistiefe <different> Falls unterschiedlich in 2. Verzeichnis <filename> Wie <patternset> <modified> Geänderte Dateien bez. Cache <present> Falls in 2. Verzeichnis existiert <size> Größe <type> dir oder file <scriptselector> Selektor in Skriptsprache © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 109
  • 110. Selectors / Selektoren • Das folgende Beispiel enthält nur die Dateien, die • Mit .xml enden • Den Text „project“ enthalten • Und deren Dateiname kein „a“ enthält <fileset dir="."> <and> <filename name="**/*.xml"/> <contains text="project" /> <none> <filename name="**/*a*.xml"/> </none> </and> </fileset> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 110
  • 111. FileMapper • Abbildung • Von bestehenden Dateien • Auf neue Dateinamen • Benutzt z. B. in • <apply>, <copy>, <move> • Das folgende Beispiel benutzt den <globmapper> und kopiert alle *.xml Dateien und hängt ein *.bak an den Dateinamen. <copy todir="backup" > <fileset dir="." includes="**/*.xml"/> <globmapper from="*.xml" to="*.xml.bak"/> </copy> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 111
  • 112. Mapper <chained> Sequentielle Ausführung <composite> Parallele Ausführung <filter> FilterChain und FilterReader, später ... <flatten> Entfernt Verzeichnisse <glob> Einfaches Ersetzen, nur ein * <identity> Identität, tut nichts <merge> Alle Dateien kommen in eine Datei <package> a/b/C.java zu a.b.C.java <regexp> Wie <glob>, aber reguläre Ausdrücke <unpackage> a.b.C.java zu a/b/C.java <scriptmapper> Erweiterung durch Skriptsprache © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 112
  • 113. FilterSet • Ein FilterSet ist eine Menge von Filtern • Ein Filter kann Text in Dateien manipulieren • Suchen & Ersetzen in <copy> • Sehr schlechte Namensgebung! • Nicht bei binären Dateien verwenden ! • Texte zwischen Anfangs- und Endtag werden ersetzt • Anfangs- und Endtags sind frei definierbar • Default ist „@“ • Zum Beispiel: Zu ersetzen sind Datum: @DATUM@ Datum: #@$DATUM#+! © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 113
  • 114. Filterset • Folgendes Beispiel setzt die Werte ein <copy file="Template.txt" tofile="README.txt"> <filterset> <filter token="DATUM" value="2999-12-24"/> </filterset> <filterset begintoken="#@$" endtoken="#+!"> <filter token="DATUM" value="3999-12-24"/> </filterset> </copy> • Es ergibt sich Datum: 2999-12-24 Datum: 3999-12-24 © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 114
  • 115. FilterChain und FilterReader • In Unix und Windows gibt es die „Pipes“ • Die Ausgabe des ersten • ist die Eingabe des zweiten usw. • Zum Beispiel • $ ps -ef | grep root | sort -n | lpr • „Drucke die Liste der Prozesse von Root sortiert nach Prozess-ID aus“ • Dieses gibt es auch in Ant (allerdings limitiert) • Eine FilterChain ist eine „Anreihung“ („Kette“) von FilterReadern. • Ein FilterReader • Liest die Eingabe • Manipuliert diese und gibt sie an die Ausgabe © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 115
  • 116. FilterChain und FilterReader • FilterReader werden verwendet in • <concat>, <copy>, <move>, <exec>, <java>, etc. <fixcrlf> Für das CR/LF-Problem <headfilter> Wie Unix head, die ersten n Zeilen <tailfilter> Wie Unix tail, die letzten n Zeilen <tabstospaces> Ersetzt Tab mit Leerzeichen <prefixlines> Setzt ein Präfix vor jede Zeile <linecontains> Filter <stripjavacomments> Entfernt Kommentare <striplinecomments> Entfernt Kommentare, z. B. #, //, -- <striplinecomments> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 116
  • 117. FilterChain und FilterReader • Das folgende Beispiel • Entfernt die Kommentare, • Ersetzt die Tabs • Und ersetzt die Zeilenbegrenzer auf „n“. <copy file="${src.dir}/beispiel/Doctor.java" tofile="Doctor2.java"> <filterchain> <stripjavacomments/> <tabstospaces tablength="2"/> <fixcrlf eol="unix"/> </filterchain> </copy> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 117
  • 118. Argumente als Attribut und Element • Es gibt oft zwei Möglichkeiten Parameter anzugeben • Als Attribut • Als Element • Zum Beispiel FileSet. • Die folgenden beiden Statements beschreiben das gleiche FileSet. <fileset dir="." includes="**/*.xml"/> • und <fileset> <include name="**/*.xml"/> </fileset> • Das Element ist flexibler, es erlaubt „nested elements“. © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 118
  • 119. Implizite Elemente • Ant beruht auf Java • Java ist Objekt-orientiert • Daher gibt es in Ant auch eine Art Vererbung • Der <javac> Task ist implizit auch ein FileSet. <javac srcdir="src" destdir="dest"> <include name="**/*.java"/> <exclude name= "**/Broken*.java" > </javac> • Ein FileSet hat ein Wurzelverzeichnis. • Bei <javac> wird dieses mit dem Attribut srcdir angegeben. • <javac> ist ein „directory-based task“ © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 119
  • 120. Nicht mehr unbekannte Fachbegriffe • Was bedeuten diese Begriffe ? • „patterns“ PatternSet • „directory based tasks“ • „fileset“ z. B. <javac> • „implicit fileset“ • „nested include/exclude elements“ • „nested patternset elements“ FileSet, PatternSet • „nested filesets“ • „extended fileset elements“ • „extended groupfileset elements“ ZipFileSet, • Fazit: Wir haben Grundwissen über Ant ! © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 120
  • 121. Die Tasks von Ant © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com
  • 122. Typen von Tasks • Ant unterscheidet • Core Tasks • werden mitgeliefert in ant.jar • Optionale Tasks • Tasks werden mitgeliefert, z. B. ant-junit.jar • zusätzliche Jar-Datei muss hinzugefügt werden • 3rd party • Werden von anderen entwickelt • Custom • Eigenentwicklungen © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 122
  • 123. Core Tasks Ant-Basis ... viele ... Archive <ear>, <jar>, <signjar>, <tar>, <war>, <zip> Dateien <basename>, <bzip2>, <dirname>, <chmod>, <checksum>, <concat>, <copy>, <delete>, <fixcrlf>, <genkey>, <gzip>, <mkdir>, <move>, <patch>, <touch> Java <apt>, <javac>, <javadoc>, <manifest>, <rmic>, Netzwerk / DB <get>, <mail>, <sql> Prozesse <apply>, <exec>, <java>, <nice>, <sleep>, <waitfor> Versionsverwaltung <cvs>, <cvschangelog>, <cvsversion>, ... XML <xslt> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 123
  • 124. Optionale Tasks Archive <cab>, <ejbjar>, <rpm> Netzwerk <ftp>, <rexec>, <scp>, <setproxy>, <sshexe>, <telnet> Sprachen <antlr>, <depend>, <icontract>, <javacc>, <javah>, <jdepend>, <jspc>, <netrexxc>, <script>, <scriptdef>, verschiedene EJB 2 Test <junit>, <junitreport> Text <native2ascii>, <replaceregexp>, <translate> Utilities <image>, <propertyfile>, <sound>, <splash> Versionsverwaltung ClearCase, Continuus, Perforce, PVCS, StarTeam, Visual SourceSafe XML <schemavalidate>, <xmlvalidate> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 124
  • 125. Ant-Contrib Tasks Ant <antcallback>, <antfetch>, <runtarget>, <relentless> Kontrollfluß <assert>, <for>, <if>, <switch>, <throw>, <trycatch> Plattform, OS <osfamily>, <shellscript> Properties <math>, <propertycopy>, <var>, <urlencode>, <sortlist>, <propertyselector>, <pathtofileset>, <propertyregexp> Conditions <isgreaterthan>, <islessthan>, <ispropertyfalse>, <ispropertytrue> Selektoren <timestampselector> Netzwerk <post>, <httpClient>, <httpState> Sonstiges <outofdate> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 125
  • 126. 3rd Party Tasks Code-Qualität PMD, Checkstyle, Findbugs, JavaNCSS J(2)EE XDoclet, versch. Applikationsserver, Hibernate Netzwerk WebDAV Sprachen AspectJ, Groovy, Scala Test Cobertura, DbUnit, HtmlUnit, Jakarta Cactus, JMeter, JUnitEE, TestNG, XMLUnit Texte Apache FOP Versionsverwaltung SvnAnt XML Apache XML Beans, Xjc (JAXB) © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 126
  • 127. Bedingte Ausführung von Tasks • Tasks lassen sich bedingt ausführen. <target name="hello" if="isHello"> <echo message="Hallo Welt"/> </target> <target name="goodbye" unless="isHello"> <echo message="Tschüss Welt"/> </target> • Bei if muss das Property gesetzt sein. • Bei unless darf es nicht gesetzt sein. © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 127
  • 128. Tasks einbinden • Tasks • Sind Java-Klassen • Erben von org.apache.tools.ant.Task • Überschreiben der execute() Methode • Mit <taskdef> wird ein Task definiert • Der Name wird einer Klasse zugewiesen <taskdef name="dbunit" classname="org.dbunit.ant.DbUnitTask" classpathref="dbunit.path" /> • Oder über Properties <taskdef resource="checkstyletask.properties" classpath="${cs.jar}"/> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 128
  • 129. Tasks einbinden: Suche nach Jars • Hierzu muss die Klasse in einer Jar-Datei im CLASSPATH sein. • Ant sucht an den folgenden Orten nach Jars • Jedes Jar aus dem $CLASSPATH. • Wenn nicht -noclasspath angegeben wurde. • Jedes Jar aus $ANT_HOME/lib • Jedes Jar aus $HOME/.ant/lib • Wenn nicht -nouserlib angegeben wurde. • Jedes Jar, das als Argument von -lib angegeben wurde. • Tip: Mit dem folgenden Kommando werden alle Jars für die optionalen Tasks zu $HOME/.ant/lib heruntergeladen. • $ cd $ANT_HOME • $ ant -f fetch.xml all -Ddest=USERNAME © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 129
  • 130. Tasks einbinden: Troubleshooting • Bei optionalen oder 3rd party Tasks gibt es oftmals mehrere notwendige Jars • Eine Jar-Datei für den Task selber • Also die Erweiterung von Ant • Eine Jar-Datei für das, was über Ant aufgerufen werden soll • Also das, um was Ant erweitert werden soll • Desweiteren werden noch weitere Jars benötigt • Wie z. B. Logging Ant Ant Task Erweiterung Hilfs-Jars © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 130
  • 131. Tasks einbinden: Troubleshooting • Beispiel der Fehlermeldung, wenn eine Jar-Datei für einen optionalen Task nicht im CLASSPATH ist. • Für <scp> löst -lib lib/jsch-0.1.29.jar das Problem. © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 131
  • 132. Tasks einbinden: Troubleshooting • Bei der folgenden Meldung wird JRuby vermisst. • Erkennbar an der ClassNotFoundException © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 132
  • 133. Core Tasks © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com
  • 134. Core Tasks Ant-Basis ... viele ... Archive <ear>, <jar>, <signjar>, <tar>, <war>, <zip> Dateien <basename>, <bzip2>, <dirname>, <chmod>, <checksum>, <concat>, <copy>, <delete>, <fixcrlf>, <genkey>, <gzip>, <mkdir>, <move>, <patch>, <touch> Java <apt>, <javac>, <javadoc>, <manifest>, <rmic>, Netzwerk / DB <get>, <mail>, <sql> Prozesse <apply>, <exec>, <java>, <nice>, <sleep>, <waitfor> Versionsverwaltu <cvs>, <cvschangelog>, <cvsversion>, ... ng XML <xslt> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 134
  • 135. Sequentiell und Parellel • Innerhalb eines Targets können Tasks sequentiell und parallel ausgeführt werden. • Dieses wird mit <sequential> und <parallel> erreicht. <parallel> <sequential> <echo>1-A</echo> <echo>1-B</echo> </sequential> <sequential> <echo>2-A</echo> <echo>2-B</echo> </sequential> </parallel> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 135
  • 136. Sequentiell und Parellel • Hier das Ergebnis. Die Prozesse 1 und 2 laufen mit unterschiedlicher „Geschwindigkeit“. © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 136
  • 137. Default-Werte: <presetdef> • <presetdef> kann Attribute und Elemente vordefinieren. • Nützlich bei „parameter-intensiven“ Tasks. • Z. B. <sql> oder <javac>. • <presetdef name="meinEcho"> <echo message="Halli-Hallo"/> </presetdef> • Aufruf mit: • <meinEcho/> • Achtung: Die Werte können wieder überschrieben werden. <meinEcho message="Guten Tag"/> • Daher nicht zum „Erzwingen“ von Konventionen geeignet. © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 137
  • 138. Neue Tasks: <macrodef> • Mit <macrodef> können neue Tasks definiert werden. • <macrodef name="meins"> <attribute name="arg1" /> <attribute name="arg2" default="default" /> <attribute name="arg3" default="**/*.xml" /> <text name="text" trim="false" optional="true" /> <element name="files" optional="true"/> <sequential> <echo>@{arg1}, @{arg2}, @{arg3}</echo> <echo>Text: @{text}</echo> <echoxml><z><files/></z></echoxml> </sequential> </macrodef> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 138
  • 139. Neue Tasks: <macrodef> • Es gibt drei Argumenttypen • Attribute <attribute name="arg2" default="default" /> • Textinhalte <text name="text" trim="false" optional="true" /> • Elemente <element name="files" optional="true"/> • Der Aufruf erfolgt z. B. folgendermaßen. <meins arg1="V" arg2="V2" arg3="**/*.xml:**/*.jsp"> Hier ist ein Text <files><fileset include="**/*.txt"/></files> </meins> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 139
  • 140. Neue Tasks und Datentypen • Mit <taskdef> können neue Tasks definiert werden. <taskdef name="ejbdoclet" classname="xdoclet.modules.ejb.EjbDocletTask" classpathref="xdoclet.class.path"/> • Hierfür gibt es bei mehreren optionalen Tasks Beispiele. • Mit <typedef> können neue Datentypen definiert werden. <typedef name="datetime" classname="org.xyz.DateTime" classpathref="somepathref"/> • Wird in der Praxis eher selten benutzt. © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 140
  • 141. Große Projeke: <antcall> und <ant> • Mit <antcall> können Targets aufgerufen werden. • Das folgende Target soll aufgerufen werden. <target name="a"> <property name="p1" value="p1"/> <echo>A ${p1}</echo> </target> • Dieses führen wir mit folgenden Statements durch. <property name="p1" value="x1"/> <antcall target="a"/> <antcall target="a" inheritall="false"/> • Beim zweiten Aufruf werden die Properties nicht „vererbt“. • Anmerkung: Es gibt keine Rückgabewerte. © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 141
  • 142. Große Projeke: <antcall> und <ant> • Dieses führt zu dem abgebildeten Ergebnis. • Mit <ant> können auch Targets in anderen Build-Dateien verwendet werden. • <ant antfile="x.xml" target="a"/> <ant antfile="x.xml" target="a" inheritall="off"/> • Wird antfile nicht angegeben, dann wird build.xml © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 142
  • 143. Große Projeke: <import> • Build-Dateien können andere mit <import> importieren. • Dieses Statement kann überall im Dokument als Element von <project> stehen. • Wir haben zwei Build-Dateien: imported.xml und importer.xml. imported.xml definiert die beiden Targets a und b. <target name="a"> <echo>Imported A</echo> </target> <target name="b"> <echo>Imported B</echo> </target> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 143
  • 144. Große Projeke: <import> • Die Datei importer.xml importiert X. <import file="imported.xml" /> • Und überschreibt das Target b. <target name="b"> <echo>Importer B</echo> </target> • Der Aufruf von •$ ant -f importer a b • zeigt, dass b überschrieben wurde. © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 144
  • 145. Core Tasks: Archive • <tar> und <zip> schreiben die Dateien aus einem FileSet in eine Tar bzw. Zip-Datei. <tar destfile="a.tar" basedir="." includes="**/*.xml"/> <zip destfile="a.zip" basedir="." includes="**/*.xml"/> • <untar> und <unzip> entpacken Archive. <untar src="a.tar" dest="testdir1"/> <unzip src="a.zip" dest="testdir2"/> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 145
  • 146. Core Tasks: Archive - Jar • <jar> hat ein implizites FileSet, d.h. ein Wurzelverzeichnis. • Dieses wird mit dem Attribut basedir angegeben. • <ear> und <war> sind Erweiterung von <jar>. • Deren Funktionalität kann auch mit <jar> und den Attributen prefix und fullpath erreicht werden • <war> kennt WEB-INF/lib und WEB-INF/classes • ZipFileSet Elemente sind vorhanden • Viele empfehlen duplicate="preserve", damit keine Elemente mit gleichem Namen in das Archiv kommen. © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 146
  • 147. Core Tasks: Archive - War • Eine War-Datei enthält Klassen, Webseiten, Jars, etc. • Diese können als FileSets spezifiert werden. • <target name="war" depends="compile"> <war destfile="${dist.war}" webxml="${web.xml}"> <classes dir="${classes.dir}"> <include name="**/*.class"/> <exclude name="**/*Test.class"/> </classes> <fileset dir="${web.dir}"/> </war> </target> • Jetzt muss die War-Datei noch deployed werden. © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 147
  • 148. Core Tasks: Archive - War • Bei Servern, die „Hot-Deployment“ unterstützen, muss die Datei nur in das richtige Verzeichnis kopiert werden. • Ist der Server auf einem anderen Rechner: <scp>. <target name="deploy" depends="war"> <copy todir="${deploy.dir}" file="${dist.war}"/> </target> • Anschliessend warten wir, bis die Anwendung gestartet ist. <target name="wait-deployed"> <waitfor checkevery="1000" maxwait="15000"> <http url="${app.url}" /> </waitfor> </target> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 148
  • 149. Core Tasks: Externe Prozesse • Mit Ant lassen sich externe Prozesse aufrufen und kontrollieren. • <apply> ruft ein externes Programm für jede Datei in einem FileSet auf. <apply command="ls -l"> <fileset dir="." includes="*.xml"/> </apply> • <exec> ruft ein externes Programm mit bestimmten Argumenten auf. <exec executable="ls"> <arg value="-l"/> <arg value="."/> </exec> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 149
  • 150. Core Tasks: Externe Prozesse • Beide können mit dem Attribute spawn vom Ant-Prozess losgelöst werden (ähnlich nohup unter Unix). • Mit <nice> bekommt der aktuelle Prozess eine neue „niceness“. <nice newpriority="+10"/> • Schlafen mit <sleep>. <sleep minutes="3" seconds="25"/> • Mit <waitfor> kann auf die Erfüllung einer Condition warten bzw. bis ein Timeout auftritt. <waitfor checkevery="1000" maxwait="5000" timeoutproperty="not.available" > <socket server="localhost" port="8080" /> </waitfor> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 150
  • 151. Core Tasks: Externe Prozesse • Java-Klassen und Jar-Dateien lassen <java> sich mit aufrufen. • Mit dem Attribut fork kann eine neue Java Virtual Machine (JVM) gestartet werden. • Diese hat einen eigenen Classloader und -Path. Aufpassen. <java fork="true" classname="groovy.ui.Console"/> • Ergibt einen NoClassDefFoundError auch beim Start mit $ ant target -lib lib/groovy-all-1.5.5.jar • Entweder man verzichtet auf das Fork. <java classname="groovy.ui.Console"/> • Oder man setzt den Classpath. • <java fork="true" classname="groovy.ui.Console" classpathref="gpath"> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 151
  • 152. Optionale Tasks © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com
  • 153. Optionale Tasks Archive <cab>, <ejbjar>, <rpm> Netzwerk <ftp>, <rexec>, <scp>, <setproxy>, <sshexe>, <telnet> Sprachen <antlr>, <depend>, <icontract>, <javacc>, <javah>, <jdepend>, <jspc>, <netrexxc>, <script>, <scriptdef>, verschiedene EJB 2 Test <junit>, <junitreport> Text <native2ascii>, <replaceregexp>, <translate> Utilities <image>, <propertyfile>, <sound>, <splash> Versionsverwaltu ClearCase, Continuus, Perforce, PVCS, StarTeam, ng Visual SourceSafe XML <schemavalidate>, <xmlvalidate> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 153
  • 154. Optionale Tasks: SCP • SCP benötigt das jsch-Jar. • Das folgende Statement übertragt ein FileSet. <scp todir="${user}:${password}@${host}:${rpath}" sftp="true" verbose="true"> <fileset dir="." includes="**/*.xml"/> </scp> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 154
  • 155. Optionale Tasks: XML • Für XML gibt es zwei Validierungsschemata: • DTD • XML-Schema • Für DTD gibt es den Task <xmlvalidate>. <xmlvalidate file="${xml.dir}/tabellendaten.xml"> <dtd publicid="TEST" location="dtd/schema.dtd"/> </xmlvalidate> • Für XML-Schema den Task <schemavalidate>. <schemavalidate file="${xml.dir}/tools.xml" /> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 155
  • 156. Optionale Tasks: JDepend • JDepend erstellt Metriken der Design-Qualität • siehe http://clarkware.com/software/JDepend.html • Der JDepend Task analysisiert die Klassen im classespath. Er erstelle eine XML-Datei. <jdepend format="xml" outputfile="jdepend/jdepend-report"> <exclude name="java*"/> ... <exclude name="junit.*"/> <classespath> <pathelement location="${classes.dir}" /> </classespath> <classpath location="${classes.dir}" /> </jdepend> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 156
  • 157. Optionale Tasks: JDepend • Im zweiten Schritt wird die XML-Datei mit <xslt> in eine HTML-Datei umgeformt. • <xslt basedir="jdepend" destdir="jdepend" includes="jdepend-report" style="lib/etc/jdepend.xsl" /> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 157
  • 158. Optionale Tasks: JDepend • Hier das Ergebnis von JDepend. © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 158
  • 159. Ant-Contrib Tasks © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com
  • 160. Ant-Contrib Tasks Ant <antcallback>, <antfetch>, <runtarget>, <relentless> Kontrollfluß <assert>, <for>, <if>, <switch>, <throw>, <trycatch> Plattform, OS <osfamily>, <shellscript> Properties <math>, <propertycopy>, <var>, <urlencode>, <sortlist>, <propertyselector>, <pathtofileset>, <propertyregexp> Conditions <isgreaterthan>, <islessthan>, <ispropertyfalse>, <ispropertytrue> Selektoren <timestampselector> Netzwerk <post>, <httpClient>, <httpState> Sonstiges <outofdate> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 160
  • 161. Ant-Contrib Tasks • Ant-Contrib bietet eine Menge Erweiterung • Manche sehen diese Erweiterungen als zu „prozedural“ an, denn Ant soll „deklarativ“ verwendet werden • Ant-Contrib ist als Antlib verwendbar. • Dieses ist ein recht neuer Packet-Mechanismus von Ant. • Um es zu verwenden, kann man es z. B. als XML- Namespace definieren. <project name="contrib" xmlns:c="antlib:net.sf.antcontrib"> • Die Tasks sind dann mit <c:XYZ> und </c:XYZ> zu verwenden. © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 161
  • 162. Ant-Contrib Tasks: <if> • Wir testen die Erreichbarkeit eines Servers mit <if>. <c:if> <http url="${url}"/> <!-- <condition> --> <c:then> <echo>Server ist da!</echo> </c:then> <c:else> <echo>Server ist nicht da!</echo> </c:else> </c:if> • <if> erwartet als erstes Argument eine <condition>. © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 162
  • 163. Ant-Contrib Tasks: <switch> • Mit <switch> kann man z. B. eine Mehrfachabfrage machen. Wir testen, welche Shell der aktuelle Benutzer hat. <property environment="env"/> <c:switch value="${env.SHELL}"> <c:case value="/bin/bash"> <echo>Benutzer von Bash</echo> </c:case> <c:default> <echo>Sonstige Shell</echo> </c:default> </c:switch> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 163
  • 164. Ant-Contrib Tasks: <foreach> • Mit <foreach> wird ein Target für jedes Element aufgerufen. <target name="kopf"> <c:foreach list="1,2,3,4,5" target="koerper" param="i" /> </target> <target name="koerper"> <echo>Schritt ${i}</echo> </target> • Es können andere Delimiter mit <delimiter> angeben werden. • Achtung: Da jedesmal ein neus Target aufgerufen wird, ist hier auf die Performance zu achten. © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 164
  • 165. Ant-Contrib Tasks: <foreach> • Iterieren über die Elemente eines FileSets. <c:foreach target="koerper" param="i"> <fileset dir="." /> </c:foreach> • Wir können auch mehrere FileSets benutzen. <c:foreach target="koerper" param="i"> <path> <fileset dir="src" /> <fileset dir="test" /> </path> </c:foreach> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 165
  • 166. Ant-Contrib Tasks: <for> • Mit <for> ist das separate Target nicht notwendig. <c:for list="1,2,3,4,5" param="i"> <sequential> <echo>Schritt @{i}</echo> </sequential> </c:for> • Intern wird <macrodef> benutzt. • Daher ist es notwendig, ‚@‘ zu benutzen. © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 166
  • 167. Ant-Contrib Tasks: <for> • Wir können auch ein FileSet benutzen. <c:for param="i"> <fileset dir="." /> <sequential> <echo>Schritt @{i}</echo> </sequential> </c:for> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 167
  • 168. 3rd Party Tasks © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com
  • 169. 3rd Party Tasks Code-Qualität PMD, Checkstyle, Findbugs, JavaNCSS J(2)EE XDoclet, versch. Applikationsserver, Hibernate Netzwerk WebDAV Sprachen AspectJ, Groovy, Scala Test Cobertura, DbUnit, HtmlUnit, Jakarta Cactus, JMeter, JUnitEE, TestNG, XMLUnit Texte Apache FOP Versionsverwaltung SvnAnt XML Apache XML Beans, Xjc (JAXB) © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 169
  • 170. DbUnit • DbUnit ist ein Testwerkzeug für die Datenbank. • Testdaten werden in XML-Dateien definiert. • Wir benötigen einen JDBC-Treiber. <path id="dbunit.path"> <path location="lib/slf4j-api-1.5.0.jar" /> <path location="lib/slf4j-simple-1.5.0.jar" /> <path location="${jdbc.jar}" /> <path location="lib/dbunit-2.2.jar" /> </path> • Definition des Tasks. <taskdef name="dbunit" classname="org.dbunit.ant.DbUnitTask" classpathref="dbunit.path" /> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 170
  • 171. DbUnit • Export der DTD des Schemas. <dbunit driver="${driver}" url="${url}" userid="${user}" password="${password}"> <export dest="${dbunit.dir}/schema.dtd" format="dtd" /> </dbunit> • Export aller Tabellen in eine XML-Datei. <dbunit driver="${driver}" url="${url}" userid="${user}" password="${password}"> <export dest="${dbunit.dir}/tabellendaten.xml" /> </dbunit> • Beobachtung: Es ist sehr unpraktisch, dbunit zu verwenden, da immer die vier Parameter übergeben werden müssen. © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 171
  • 172. DbUnit und <presetdef> • Lösung: Mit <presetdef> können Default-Parameter an einen Wrapper-Task gebunden werden. • <presetdef name="mydbunit"> <dbunit driver="${driver}" url="${url}" userid="${user}" password="${password}"/> </presetdef> • Jetzt sieht der Export der DTD des Schemas folgendermaßen aus. • <mydbunit> <export dest="${dbunit.dir}/schema.dtd" format="dtd" /> </mydbunit> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 172
  • 173. DbUnit und <presetdef> • Export der Tabelle „farbe“ mit SELECT-Statement und der Tabelle „osterei“. • <mydbunit> <export dest="${dbunit.dir}/partiell.xml"> <query name="Q" sql="SELECT * FROM farbe"/> <table name="osterei"/> </export> </mydbunit> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 173
  • 174. XDoclet • XDoclet • Attribute-Oriented-Programming • wird bei der EJB 2-Entwicklung angewendet • XDoclet bietet eine Menge von Ant-Tasks. • ejbdoclet • webdoclet • hibernatedoclet • springdoclet • jdodoclet • jmxdoclet • und noch einige mehr © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 174
  • 175. XDoclet: <ejbdoclet> • EJB 2-Anwendungen haben eine gewisse Redundanz an Interfacen. Diese sind jeweils für den Server und die Clients anzulegen. • Mit XDoclet werden im Sourcecode Tags hinterlegt, aus denen dann die entsprechenden Interfaces und Klassen generiert werden. • Der Pfad. <path id="xdoclet.class.path"> <fileset dir="lib/xdoclet-1.2.3/lib" includes="*.jar"/> <fileset dir="lib/xdoclet-1.2.3/samples/lib" includes="*.jar"/> </path> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 175
  • 176. XDoclet: <ejbdoclet> • Der Task. <taskdef name="ejbdoclet" classname="xdoclet.modules.ejb.EjbDocletTask" classpathref="xdoclet.class.path"/> • Der Aufruf für alle Dateien in src.dir. <ejbdoclet destdir="${generated.dir}" excludedtags="@author" ejbspec="2.0" addedtags="@xdoclet-generated at ${TODAY}"> <fileset dir="${src.dir}" includes="**/*Bean.java"/> • Auf der nächsten Seite geht es weiter. © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 176
  • 177. XDoclet: <ejbdoclet> • Wir generieren Remote-, Local- und Home-Interfaces. • <remoteinterface pattern="{0}"/> <localinterface pattern="{0}Local"/> <homeinterface/> <localhomeinterface/> <session/> <utilobject cacheHomes="true" kind="physical" includeGUID="true"/> <deploymentdescriptor destdir="${meta.inf}"/> <jboss version="4.0" destdir="${meta.inf}" /> </ejbdoclet> • Eine genaue Erklärung wäre Out-of-Scope des Vortrags. © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 177
  • 178. JUnitEE • JUnitEE ermöglicht Unit-Tests auf dem Applikationsserver. • Mit <juniteewar> wird eine War-Datei erstellt, die den Testserver und die zu testenden Klassen enthält. <juniteewar destFile="${dist.dir}/${junitee.war}"> <lib dir="lib" includes="*.jar> <classes dir="${classes.dir}" includes="**/*.class" /> <testcases dir="${classes.dir}" includes="**/*Test.class" /> </juniteewar> • Mit <lib> werden die benötigten Bibliotheken und mit <testcases> die Testklassen angegeben. © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 178
  • 179. JUnitEE • Die Tests können automatisch mit Ant ausgeführt werden. <junitee url="${url}" printsummary="true"> <test runall="true" /> </junitee> • Oder manuell über eine Webseite. © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 179
  • 180. Groovy • Groovy ist eine dynamische Programmiersprache. • Es gibt zwei Tasks für Groovy. • Einen zum Ausführen von Groovy-Code direkt in Ant. • <taskdef name="groovy" classname="org.codehaus.groovy.ant.Groovy" classpath="${groovy.jar}"/> • Und einen Task zum Kompilieren von Groovy. <taskdef name="groovyc" classname="org.codehaus.groovy.ant.Groovyc" classpath="${groovy.jar}"/> • Groovy kann auch über die Script-Möglichkeiten von Ant genutzt werden. Siehe das Kapitel „Ant erweitern“. © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 180
  • 181. Groovy • Groovy-Programme können direkt in Ant verfasst werden. • <groovy> println "Hallo Groovy" int n = 100 def ks = (0..n).toList().inject(0) { a,b -> a+b } println "Die Summe von 1..${n} ist ${ks}" </groovy> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 181
  • 182. Groovy • Groovy ist vollständig in Java integriert. • Groovy kann Java-Klassen benutzen und umgekehrt. <groovy> import java.text.SimpleDateFormat def gc = new GregorianCalendar() gc.time = new Date() gc.add Calendar.MONTH, 3 def format = new SimpleDateFormat('dd.MM.yyyy') println "In drei Monaten ist der " + format.format(gc.time) </groovy> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 182
  • 183. PMD • PMD ist ein Werkzeug zur Quellcodeanalyse. • Es kann mögliche Fehler, suboptimalen Code, etc. finden • Ist mit Regeln konfigurier und erweiterbar • Wir definieren einen Pfad für die benötigten Jars. <path id="pmd.class.path"> <path location="lib/jasm-3.1.jar"/> <path location="lib/jaxen-1.1.1.jar"/> <path location="lib/pmd-4.2.1.jar"/> </path> • Wir definieren den PMD-Task. <taskdef name="pmd" classname="net.sourceforge.pmd.ant.PMDTask" classpath="lib/pmd-4.2.1.jar" /> © 2008 - 2009 Jörn Dinkla, http://www.dinkla.com 183

Notes de l'éditeur

  1. Properties: die Konstanten, nicht Variablen, Resourcen: Ant braucht Dateien und Verzeichnisse PatternSet: Auswahl von Dateinamen, Selektoren: Auswahl anhand Eigenschaften FileMapper: Umbennen, FilterSet: SCHLECHTER NAME, Dateitransformation, FilterChain, FilterReader: SCHLECHTER NAME, Unix pipes