C#.NET * C++ * JAVASCRIPT * PYTHON * DIVERSES
XML * XML-SCHEMA * XPATH * XSL * XSL-FO * SVG * XQUERY * XPROC * ANT



ANT

ANT

ANT

➪ Ein wesentlicher Ansatz zur Verbesserung der Abeitsprozesse besteht in deren Automatisierung. Die Konfiguration der Prozesse wird immer häufger in XML definiert. Der seit vielen Jahren bewährte ANT Standard erlaubt, zahlreiche Standardaufgaben wie mkdir, copy, delete, javac, Mails, zip/unzip, auch XSL-Transformationen und XSD-Validierungen in XML zu konfigurieren und aufzurufen. In aller Regel stehen leistungsfähige Tools zur Verfügung, die diese Prozessdefinition effizient umsetzen.

Auf dieser Seite:

siehe auch und .

Ein seit vielen Jahren bewährter Standard ist ANT. ANT erlaubt, zahlreiche Standardaufgaben wie mkdir, copy, delete, javac, Mails, zip/unzip, auch XSL-Transformationen und XSD-Validierungen in XML zu konfigurieren und aufzurufen.

XSL - Transformationen mit ANT

Der folgende Ansatz führt eine XSL-Transformation durch.


<project name="MYANTPROJECT" default="tuwas">
  <target name="tuwas">
    <xslt 
       out="C:/wg/out/zweiGruppen.xml"
       in="C:/wg/tst/Ort_Elemente.xml"
       style="C:/wg/xsl/p3_XML2XML_2Gruppen.xsl"/>
  </target>
</project>

Praktischer ist es, komplexere Aufgaben in targets zusammenzufassen, die sich mit sinnvollen Parametern aufrufen lassen. Im folgenden Beispiel übernimmt das Target "runxsltransformation" die Hauptaufgabe, die über das Target "tuwas" via antcall target="runxsltransformation" aufgerufen wird. Dabei lässt sich auch gleich der passende XSL-Prozessor festlegen, dessen jar-Datei im "processorpath" niedergelegt werden muss.


<project name="MYANTPROJECT" default="tuwas">
  <property name="wgpath" value="C:/wg"/>
  <property name="processorpath" value="C:/myjars/lib"/>
  <target name="tuwas">
    <antcall target="runxsltransformation">
        <param 
               name="poutput" 
               value="${wgpath}/ouput/ergebnis.xml" />
        <param 
               name="pinput" 
               value="${wgpath}/input/Ort_Elemente_Namespaces" />
        <param 
               name="pstyle" 
               value="${wgpath}/xsl/XPathBeispiele.xsl" />
        <param 
               name="pprocessor" 
               value="saxon" />
    </antcall>
  </target>
  <target name="runxsltransformation">
    <delete file="${poutput}" />
    <echo message="deleted: ${poutput}"/>   
    <xslt 
          style="${pstyle}.xsl" 
          in="${pinput}.xml" 
          out="${poutput}" 
          classpath="${processorpath}/${pprocessor}.jar" />
    <echo message="generated: ${poutput}"/>
  </target>
</project>

XSD-Input-Validierung, XSL-Transformation, XSD-Output-Validierung

Der folgende Ansatz validiert ein XML-Input Dokument, führt daraufhin eine XSL-Transformation durch, deren Ergebnis mit dem Ziel-Schema validiert wird. Auf diese Weise können mehrere XSL-Prozesse nacheinander aufgerufen werden. Wichtig ist dabei, sicherzustellen, dass die einzelnen Prozesse auch threadsicher ablaufen. Siehe auch .


<project default="default">
 <target name="default">
  <antcall target="validateInput"/>
  <antcall target="transform2Gruppen"/>
  <antcall target="validateOutput"/>
 </target>
 <target name="validateInput">
  <xmlvalidate 
       file="../../tst/Ort_Elemente.xml" 
       failonerror="false" 
       warn="true">
   <attribute 
       name="http://apache.org/xml/features/validation/schema" 
       value="true"/>
   <attribute 
       name="http://xml.org/sax/features/namespaces" 
       value="true"/>
   <property
       name="http://apache.org/xml/properties/schema/
                    external-noNamespaceSchemaLocation"
       value="../xsd/Ort_Elemente.xsd"/>
  </xmlvalidate>
  <echo>done: XML-Input file validated against XML-Schema</echo>
 </target>
 <target name="transform2Gruppen">
  <xslt 
       out="../zweiGruppen.xml"
       in="../../tst/Ort_Elemente.xml"
       style="../../xsl/p3_XML2XML_2Gruppen.xsl">
  </xslt>
  <echo>done: transform2Gruppen</echo>
 </target>
 <target name="validateOutput">
  <xmlvalidate 
       file="../expected/zweiGruppen.xml" 
       failonerror="false" warn="true">
   <attribute name="http://apache.org/xml/features/validation/schema" 
       value="true"/>
   <attribute 
       name="http://xml.org/sax/features/namespaces" 
       value="true"/>
   <property
       name="http://apache.org/xml/properties/schema/
                    external-noNamespaceSchemaLocation"
       value="../xsd/ZweiGruppen.xsd"/>
  </xmlvalidate>
  <echo>done: generated XML Output file validated against XML-Schema</echo>
 </target> 
</project>

Java-Aufrufe in ANT

Sie können auch eigene Java-Klassen in ANT aufrufen. Beispiel:


public class SimpleTest {
    public static void main(String[] args) {
        for(int i=1; i<4; i++){
            System.out.printf("Hallo %d%n", i);
        }
    }
}

Kompilieren Sie die Klasse in geeigneter Weise, zum Beispiel kommandozeilenbasiert mit javac:


C:/mein_Pfad_zur_Klasse/src>javac SimpleTest.java

Das Compile-Ergebnis sollte eine neue Datei SimpleTest.class sein, die Sie über ANT aufrufen können. (Alternativ können Sie auch mit dem ANT-Tag <javac> arbeiten, hier kann es Ihnen jedoch passieren, dass das System den Java-Compiler nicht automatisch findet, sodass Sie erst etwas mit JAVA_HOME arbeiten müssen, bevor alles korrekt funktioniert.)


<project basedir="." default="tuwas">
    <target name="tuwas">
        <java 
             classpath="C:/mein_Pfad_zur_Klasse/src" 
             classname="SimpleTest"/>
    </target>
</project>

Das Ergebnis des Aufrufes sieht dann so aus:


tuwas:
     [java] Hallo 1
     [java] Hallo 2
     [java] Hallo 3

JavaScript-Aufrufe in ANT

In ANT können Sie auch mit JavaScript und Java arbeiten. Das folgende Beispiel arbeitet zunächst mit JavaScript.

Im ersten Teil durchläuft der Code eine Schleife von 1 bis 3, generiert jedesmal einen Ant-Task "echo", der nacheinander "Hallo 1", "Hallo 2", "Hallo 3" ausgibt.

Im zweiten Teil bindet JavaScript die Java-Klasse java.io.File ein und listet mit deren Hilfe sämtliche XML-Dateien in einem Verzeichnis aus.


  <target name="tuwas">
    <script language="javascript">
      <![CDATA[      
      for(i=1; i<4; i++){
        var t = self.project.createTask("echo");
        t.setMessage("Hallo " + i);
        t.perform();
      }
      ]]>
    </script>
    <scriptdef language="javascript" name="list_files">      
      <![CDATA[                
        verz = new java.io.File("irgendeinverzeichnis");
        if(verz.isDirectory()) {
          dateiliste = verz.listFiles(); 
          for (i=0; i<dateiliste.length; i++) {
            file = dateiliste[i];
            if(file.getName().contains(".xml")){
              var echo = self.project.createTask("echo");
              echo.setMessage("path: " + file.getAbsolutePath());
              echo.perform();              
            }
          }    
        }
       ]]>
    </scriptdef>
    <list_files/>
  </target>

wg / 2. Juni 2020



Fragen? Anmerkungen? Tipps?

Bitte nehmen Sie Kontakt zu mir auf.




XProc



Vielen Dank für Ihr Interesse an meiner Arbeit.



V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de

www.wilfried-grupe.de/ANT.html