如何定义用连字符命名的任务



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使用两种方法来识别元素和属性:

  1. 基于Java名称的反射,在xml中映射,忽略manouti答案中解释的大小写
  2. 基于接口。org.apache.tools.ant.DynamicElementorg.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() {
   }
}

相关内容

  • 没有找到相关文章

最新更新