具有自定义嵌套类型的Ant任务

时间:2018-11-25 05:53:14

标签: java ant

我正在遵循Apache Ant文档中的“ Writing Your Own Task”,但无法使其与Condition以外的其他接口一起使用:

CustomTask.java 中:

public final class CustomTask extends Task {
    public void add(final Type type) {
        log("Got: " + type + " with value: " + type.getValue());
    }

    @Override
    public void execute() {
        log("Executing custom task...");
    }
}

Type.java 中:

public interface Type {
    String getValue();

    void setValue(final String value);
}

DefaultType.java 中:

public class DefaultType implements Type {
    private String value;

    @Override
    public String getValue() {
        return value;
    }

    @Override
    public void setValue(final String value) {
        this.value = value;
    }
}

在我要使用它们的 build.xml 中:

<taskdef name="custom-task" classname="CustomTask" classpathref="run_classpath" />
<typedef name="default-type" classname="DefaultType" classpathref="run_classpath" />

<target name="custom">
    <custom-task>
        <default-type value="Hello world!" />
    </custom-task>
</target>

但是出现以下错误:

.../build.xml:37: custom-task doesn't support the nested "default-type" element.

这里令人发疯的是,如果我使DefaultType实现org.apache.tools.ant.taskdefs.condition.Condition接口(如文档中的示例所示)并将以下方法添加到CustomTask类中:

public void add(final Condition condition) {
    log("Got: " + condition);
}

它起作用:(!?!?!)

custom:
[custom-task] Got: DefaultType@5a39699c
[custom-task] Executing custom task...

我不明白,org.apache.tools.ant.taskdefs.condition.Condition接口仅可与之配合使用的特殊之处是什么?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

如果您将loaderref属性添加到两个具有相同值的定义(似乎可以是任何内容,this is not clear in the documentation),问题似乎就消失了:

<taskdef
    name="custom-task"
    classname="CustomTask"
    classpathref="run_classpath"
    loaderref="my_loader" />

<typedef
    name="default-type"
    classname="DefaultType"
    classpathref="run_classpath"
    loaderref="my_loader" />