2009-07-08 9 views
2

Ich schreibe eine benutzerdefinierte Ant-Aufgabe, die einen benutzerdefinierten geschachtelten Typ akzeptieren muss.Benutzerdefinierte Aufgaben in Ant: ADDTYPE (TYPE x) vs. add (TYPE x) (letzteres funktioniert nicht)

Nach the Ant manual sollte ich in der Lage sein, addConfigured (TYPE x) anstelle von addConfiguredTYPE (TYPE x) zu verwenden. Gemäß this article (Abschnitt Neue Reflektionsregeln, Polymorphismus in Ant 1.6) wurde die Unterstützung für addConfigured (TYPE x) in Ant 1.6 hinzugefügt.

<taskdef name="custom-task" classname="com.acme.CustomTask"> 
    <classpath refid="task.classpath" /> 
</taskdef> 

<typedef name="custom-type" classname="com.acme.CustomTask$CustomType"> 
    <classpath refid="task.classpath" /> 
</typedef> 

... 

<custom-task> 
    <custom-type/> 
</custom-task> 

Die Aufgabe ist in Java implementiert

public class CustomTask extends Task 
{ 
    ... 

    public void addConfigured(CustomType t) 
    {...} 

    .... 

    public static class CustomType 
    {...} 
} 

Wenn ich versuche, die Build-Skript auszuführen, erhalte ich die folgende Ausnahme:

Build Failed: custom-task doesn't support the nested "custom-type" element.

Allerdings, wenn ich ändern

<typedef name="custom-type" classname="com.acme.CustomTask$CustomType"> 
... 
<custom-task> 
    <custom-type/> 
</custom-task> 
... 
public void addConfigured(CustomType t) 

bis

<typedef name="customtype" classname="com.acme.CustomTask$CustomType"> 
... 
<custom-task> 
    <customtype/> 
</custom-task> 
... 
public void addConfiguredCustomType(CustomType t) 

alles funktioniert wie erwartet.

Gibt es einen Grund, warum die generische addConfigured (TYPE x) -Technik in meinem Fall nicht zu funktionieren scheint?

Andere Leute here und here hatten das gleiche Problem.

PS: Ant Version 1.7.0

+0

Ich nehme an, Sie meinten: 'typedef name =" mein-benutzerdefinierter type "' oder 'typedef name =" mycustomtype "'? – VonC

+0

Nein, ich habe im ersten Teil meinen "benutzerdefinierten Typ" gemeint. Striche im Namen zu haben ist der einzige Grund, warum ich die generische addConfigured (TYPE x) -Methode verwenden möchte. – niktech

+0

Ja, ich verstehe, aber Sie haben geschrieben: 'typedef name =" custom-type "' in Ihrem ersten Beispiel, kurz bevor Sie das '' Element verwenden, das mich verwirrt. – VonC

Antwort

1

Haben Sie versucht, die Definitionsreihenfolge zu ändern, d. H., Zuerst den Typdef? Nicht sicher, ob das wichtig ist, aber es ist einen Versuch wert.

Haben Sie auch versucht, dies in eine Antlib zu packen? In meiner Firma haben wir viele benutzerdefinierte Aufgaben und ich weiß, dass die einfachen Methoden add und addConfigured funktionieren. Wir verwenden antlibs und definieren die Typen immer zuerst in antlib.xml

+0

Packing die Aufgabe und geben Sie defs in antlib.xml hat den Trick! Scheint, dass es einen großen Fehler in Ant gibt, der verhindert, dass dasselbe ohne antlib.xml gemacht wird. – niktech

1

die Ant manual Bedenkt man, dass nicht angibt:

Der Name des Add (addConfigured) -Methode muss der Elementname mit add (addConfigured), gefolgt beginnen .

, die Tatsache, umbenannt Sie Ihre „addConfigured“ Methode der eigentliche Schlüssel zum „addConfiguredCustomType“ war, um es hier zu arbeiten.

+0

http://ant.apache.org/manual/develop.html#nestedtype Ant speziell für addConfigured (TYPE x) und hinzufügen (TYPE x). Laut http://www.oracle.com/technology/pub/articles/bodewig_taskwriters.html wurde diese Unterstützung in Ant 1.6 – niktech

0

Die Ant manual section zum Schreiben Ihrer eigenen Aufgaben ist schlecht geschrieben, aber es heißt, dass Ihre Methode entweder "addCustomType" oder "addConfiguredCustomType" genannt werden kann, nicht nur "addConfigured". Die verschiedenen Arten, alles zu deklarieren, haben feine Unterschiede, also lesen Sie sie sorgfältig durch und finden Sie die richtige.

+0

hinzugefügt. Der Abschnitt, der dem von Ihnen erwähnten folgt, besagt, dass es möglich ist, add (TYPE x) und addConfigured zu verwenden (TYP x). Laut http://www.oracle.com/technology/pub/articles/bodewig_taskwriters.html, im Abschnitt Neue Reflektionsregeln> Polymorphismus in Ant 1.6, ist es klar, dass man public void addConfigured (X) verwenden kann; beginnend mit Ant 1.6 – niktech

+0

OK, so ist es jetzt noch verwirrender. Geh einfach mit was funktioniert. – skaffman

+0

Der Grund, warum ich versuche, mit addConfigured (X) zu gehen, ist, weil ich Bindestriche in Typname verwenden möchte. Wenn Sie addConfiguredX (X) verwenden, kann X keine Gedankenstriche enthalten. – niktech

Verwandte Themen