2010-01-12 2 views
11

Bei der Deklaration externe ant Aufgaben mit taskdef zum Beispiel antcontrib laden kann, ist die vorgeschlagene Einrichtung die followin taskdef zu verwenden:Warum kann Ant taskdef nicht eine Ressource außerhalb ./net

<taskdef resource="net/sf/antcontrib/antcontrib.properties"> 
    <classpath> 
    <pathelement location="lib/ant-contrib/ant-contrib-1.0b3.jar"/> 
    </classpath> 
</taskdef> 

Dies funktioniert, wenn antcontrib .properties befindet sich in net/sf/antcontrib relativ zur Datei build.xml.

Aber wenn ich es in lib/net/sf/antcontrib und ändert die taskdef in

<taskdef resource="lib/net/sf/antcontrib/antcontrib.properties"> 
    <classpath> 
    <pathelement location="lib/ant-contrib/ant-contrib-1.0b3.jar"/> 
    </classpath> 
</taskdef> 

Ant ist nicht in der Lage die Eigenschaften zu finden Datei, es gibt dem Fehler

[taskdef] Could not load definitions from resource 
lib/net/sf/antcontrib/antcontrib.properties. It could not be found. 

Es sieht so aus, als ob ant das lib-Verzeichnis separat behandelt und keine taskdef-Ressource von dort lädt.

Antwort

5

Wie Alex sagte, sollten Sie nicht das Glas entpacken müssen. Die <taskdef> kann antcontrib.properties direkt aus dem Jar laden.

Der Fehler, den Sie haben, ist, weil Sie den Ressourcenpfad geändert haben, aber der Pfad zu der Datei im komprimierten jar/zip ist immer noch derselbe. Der Taskdef berücksichtigt die Eigenschaftendatei, die Sie verschoben haben, nicht, da die <classpath>, die Sie an <taskdef> übergeben haben, angibt, dass sie nur in das Jar schauen soll.

+1

Ich hatte eine gültige und hatte auch Nachdem ich Ihre Erklärung gelesen hatte, erkannte ich, dass ich die Eigenschaftendatei entfernen konnte und die Ant-Contrib-Tasks funktionierten. Ich habe das Taskdef auf der Installationsseite http://ant-contrib.sourceforge.net/#install – Ernelli

+0

verwendet. Sie haben uns Stunden des Ratens gespart - relativ zum Jar-Pfad war der Schlüssel. –

4

Verwenden antlib.xml Ressource:

Hier ist die taskdef Definition, die ich benutze:

<property name="ant-contrib.jar" location="..."/> 

<taskdef 
    resource="net/sf/antcontrib/antlib.xml" 
    uri="http://ant-contrib.sourceforge.net" 
> 
    <classpath> 
    <pathelement location="${ant-contrib.jar}"/> 
    </classpath> 
</taskdef> 

Sie müssen nicht alles aus der JAR-Datei zu extrahieren. Außerdem ist das Attribut uri optional, wenn Sie keine Namespaces mit Antcontrib-Tasks verwenden möchten.

2

Um Klassenpfad für Aufgaben Definitionen zu behandeln, verwende ich eine Classpath Ref in Ant, es ist viel einfacher. Sie können entweder ein Verzeichnis mit Klassen verknüpfen, entweder ein Verzeichnis mit vielen .jar-Dateien, (natürlich) eine einzelne .jar-Datei.

Zum Beispiel:

<!-- Properties --> 
    <property name="lib" value="lib/" /> 
    <property name="classes" value="bin/" /> 

    <!-- Classpath definition --> 
    <path id="runtime-classpath" > 
     <pathelement location="${bin}" /> 
     <fileset dir="${lib}"> 
      <include name="*.jar"/> 
     </fileset> 
    </path> 

    <!-- Taskdefs definitions --> 
    <taskdef name="myTask" classname="org.stackoverflow.tasks.MyTask" classpathref="runtime-classpath" /> 

    <!-- Tasks --> 
    <target name="test" description="Test Action"> 
      <myTask parameter1="value" /> 
    </target> 
+0

Gute Tipp;) Allerdings verwenden Sie '', aber es gibt keine Eigenschaft namens 'bin'. Vielleicht liegt der Fehler in der Zeile '' wo 'classes' durch' bin' ersetzt werden sollte ... Prost ;-) – olibre