build.xml
<taskdef
onerror ="ignore"
name ="monitor-client"
classpath="${jar-client}"
classname="hpms.app.mon.client.AntTask" />
<target name="run-client" depends="compile-sample" description="Launch monitor">
<monitor-client
layout ="Layout.xml"
gui ="true"
autostart ="true">
<log-server
port ="3000"
capacity="2048" />
...
AntTask.java
public final class AntTask extends Task {
private ...
public void setLayout( String layout ) {
}
public void setGui( boolean gui ) {
}
public void setAutostart( boolean autostart ) {
}
public void addConfiguredLogServer( LogServer logServer ) {
}
@Override
public void execute() {
...
}
}
执行
Buildfile: ...build.xml
compile-sample:
run-client:
BUILD FAILED
...build.xml:116: monitor-client doesn't support the nested "log-server" element.
问题
我搜索元素和属性的适用命名规则以及到Java语言的映射规则。
org.apache.tools.ant.IntrospectionHelper
是进行内省以从setter方法中提取属性的类。
来自构造函数的Javadocs:
void setFoo(Bar)
被识别为用于设置属性foo
的值的方法,只要Bar
是非空的并且不是数组类型。非字符串参数类型总是重载字符串参数类型,但这是在优先级方面做出的唯一保证。
基于matt评论的回答,非常感谢他!
ApacheANT使用两种方法来识别元素和属性:
- 基于Java名称的反射,在xml中映射,忽略manouti答案中解释的大小写
- 基于接口。
org.apache.tools.ant.DynamicElement
和org.apache.tools.ant.AttributeElement
当使用特殊字符(如连字符)时,必须使用接口将XML标识符映射到Java标识符,如下所示:
import org.apache.tools.ant.DynamicElement;
import org.apache.tools.ant.Task;
public final class AntTask extends Task implements DynamicElement {
private ...
public void setLayout( String layout ) {
}
public void setGui( boolean gui ) {
}
@Override
public Object createDynamicElement( String name ) {
if( name.equals( "log-server" )) {
return new Logserver();
}
return null;
}
...
@Override
public void execute() {
}
}