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

Java 如何定义使用连字符命名的任务?,java,ant,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"> <mon

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" />
...
执行

Buildfile: ...\build.xml
compile-sample:
run-client:

BUILD FAILED
...\build.xml:116: monitor-client doesn't support the nested "log-server" element.
问题

Buildfile: ...\build.xml
compile-sample:
run-client:

BUILD FAILED
...\build.xml:116: monitor-client doesn't support the nested "log-server" element.
我搜索元素和属性的适用命名规则以及到Java语言的映射规则。

是一个进行内省以从setter方法中提取属性的类

从构造函数的Javadocs中:

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

基于答案,多谢他

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

  • 基于Java名称的反射,映射为xml忽略大小写,如中所述
  • 基于接口
    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() {
       }
    }
    

    谢谢我已经检查了getPropertyName()方法:
    methodName.substring(prefix.length()).toLowerCase(Locale.ENGLISH)
    。我知道问题不在于方法名,而在于到XML的映射。因为连字符不能出现在Java标识符中,所以不能在XML中使用。我发现了这个,我认为它符合您的要求: