2014-11-10 6 views
5

build.xmlCome posso definire un'attività denominata con un trattino?

<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() { 
     ... 
    } 
} 

Esecuzione

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

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

Domanda

Cerco le regole di denominazione applicabili per elementi e attributi e le regole di mappatura in linguaggio Java.

+1

ho trovato questo che penso fa quello che si vuole: http://mail-archives.apache.org/mod_mbox/ant-dev/201009.mbox/%[email protected]%3E – matt

risposta

1

Risposta basata su mattcomment, molte grazie a lui!

Apache ANT utilizzare due modi per identificare elementi e attributi:

  1. riflessione basata sui nomi Java, mappati in XML ignorare caso, come spiegano nella manoutianswer.
  2. Interfacce basate. org.apache.tools.ant.DynamicElement e org.apache.tools.ant.AttributeElement

Interfacce deve essere utilizzato per mappare gli identificatori XML per identificatori di Java, quando i caratteri speciali vengono utilizzati, come il trattino, come illustrato di seguito:

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() { 
    } 
} 
1

org.apache.tools.ant.IntrospectionHelper è la classe che esegue l'introspezione per estrarre gli attributi dai metodi setter.

Dalle Javadocs del costruttore:

void setFoo(Bar) è riconosciuta come un metodo per impostare il valore dell'attributo foo, purché Bar è non nullo e non è un tipo array. I tipi di parametri non stringa sovraccaricano sempre i tipi di parametri stringa, ma questa è l'unica garanzia garantita in termini di priorità.

+0

Grazie. Ho controllato il metodo getPropertyName(): 'methodName.substring (prefix.length()). ToLowerCase (Locale.ENGLISH)'. Ho capito che il problema non è il nome del metodo ma la mappatura all'XML. Poiché il trattino non può essere visualizzato nell'identificatore Java, non può essere utilizzato in XML. – Aubin

Problemi correlati