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

时间:2014-11-10 09:08:55

标签: java ant

的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语言。

2 个答案:

答案 0 :(得分:1)

org.apache.tools.ant.IntrospectionHelper是用于从setter方法中提取属性的内省类。

从构造函数的Javadocs:

  

void setFoo(Bar)被认为是设置属性foo的值的方法,只要Bar为非void且不是数组类型即可。非String参数类型总是重载String参数类型,但这是在优先级方面做出的唯一保证。

答案 1 :(得分:1)

基于matt comment的答案,非常感谢他!

Apache ANT使用两种方法来识别元素和属性:

  1. 基于Java名称的反射,在xml忽略案例中映射为manouti answer中的解释。
  2. 基于接口。 org.apache.tools.ant.DynamicElementorg.apache.tools.ant.AttributeElement
  3. 当使用特殊字符时,必须使用接口将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() {
       }
    }