良い知らせと悪い知らせがありました。悪いニュースは、すぐに使えるソリューションがないことです。良いニュースは、保護されたメソッドxmlproperty
を公開するおかげで、タスクがかなり拡張可能であることです。processNode()
できることは次のとおりです。
lib
1. ant.jar ( ant ディストリビューションのサブディレクトリにあるものを見つけるか、Maven から取得できます) をクラスパスに次のコードを作成してコンパイルします。
package pl.sobczyk.piotr;
import org.apache.tools.ant.taskdefs.XmlProperty;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
public class MyXmlProp extends XmlProperty{
@Override
public Object processNode(Node node, String prefix, Object container) {
if(node.hasAttributes()){
NamedNodeMap nodeAttributes = node.getAttributes();
Node nameNode = nodeAttributes.getNamedItem("name");
if(nameNode != null){
String name = nameNode.getNodeValue();
String value = node.getTextContent();
if(!value.trim().isEmpty()){
String propName = prefix + "[" + name + "]";
getProject().setProperty(propName, value);
}
}
}
return super.processNode(node, prefix, container);
}
}
2. あとは、このタスクを ant から見えるようにするだけです。最も簡単な方法: task
Ant スクリプトがあるディレクトリにサブディレクトリを作成する -> コンパイル済みの MyXmlProp クラスをそのディレクトリ構造と共にtask
ディレクトリにコピーするので、次のような結果になるはずです: task/pl/sobczyk/peter/MyXmlProp.class
.
3. タスクを Ant スクリプトにインポートすると、次のようになります。
<target name="print">
<taskdef name="myxmlproperty" classname="pl.sobczyk.piotr.MyXmlProp">
<classpath>
<pathelement location="task"/>
</classpath>
</taskdef>
<myxmlproperty file="config.xml" prefix="build"/>
<echo message="name = ${build.resources.string[id]}"/>
</target>
4. ant を実行すると、次のように表示されます。[echo] name = id17
ここで行ったことは、特定のケースに合わせて特殊な派手な角括弧構文を定義することです:-)。いくつかのより一般的なソリューションタスクの拡張では、もう少し複雑になる場合がありますが、すべてが可能です:)。幸運を。