私は Apache Ant を、何度も繰り返さなければならない退屈なデータ収集と計算タスクのツールとして使用しています。カスタム Ant タスクをいくつか定義しましたが、それらは非常にうまく機能します。
<typedef>
ただし、タグを使用して新しいデータ型を作成したいと考えています。build.xml
私のJavaプロジェクトの1つからの通常のビルドファイルからの次の例のように、後で参照できるように、myの最初にいくつかのデータを定義したいと思います。
<path id="classpath.build">
<fileset dir="${dir.lib}">
<include name="**/*.jar" />
<exclude name="**/junit*" />
</fileset>
</path>
そこで、次のような単純な HelloWorld の例を作成しました。
<sampledata data="LOL" id="someid" />
カスタム Ant タスクでは、次のデータ型を参照したいと思います。
<customtask dataref="someid" />
これはかなり単純に思えるので、API ドキュメントを掘り下げた後、クラスを拡張org.apache.tools.ant.types.DataType
する必要があり、メソッドが必要であることがわかりましたsetRefid(org.apache.tools.ant.types.Reference r)
。
私のカスタム Ant タスク customtask は、dataref 属性に次のコードを使用します。
public class CustomTask extends Task {
private SampleData data;
public void setDataref(Reference r) {
data = new SampleData(getProject());
data.setRefid(r);
}
public void execute() {
System.out.println(data.getData());
}
}
私の SampleData 実装は次のようになります。
public class SampleData extends DataType {
private String data;
public SampleData(Project project) {
setProject(project);
}
public void setData(String data) {
this.data = data;
}
public String getData() {
return this.data;
}
public void setRefid(Reference r) {
super.setRefid(r);
}
}
org.apache.tools.ant.types.Path
これはすべて、私が望む動作を示すソースに基づいています。
ただし、上記で定義した customtask を使用してターゲットを作成すると、出力はnull
. したがって、SampleData はインスタンス化されますが、参照が正しく設定されていません。デバッグすると、SampleData が ant ファイルでデータとともに正しくインスタンス化されLOL
、refence が に設定されていることがわかりましたsomeid
。また、CustomTask
クラスsetDataref
メソッドには実際に という名前の参照が渡されるsomeid
ため、メソッド内ですべてがうまくいかsetDataref
ないのですが、何をしなければならないのか見当がつかず、マニュアルが不足しています (または重要な部分が欠落しています)。
ID を持つカスタム データ型のライフサイクルを完全には把握していないように感じます。
編集 23-11-2012 9:24:
のソースをさらにいじって調べた後、org.apache.tools.ant.types.Path
そこにあるいくつかのメソッドに従い、 SampleData.getData を次のように変更しました。
public String getData() {
if(isReference()) {
return ((SampleData)getCheckedRef()).getData();
}
return this.data;
}
私はもう少し進んでいますが、今では次の Ant エラーが my に表示されますbuild.xml
:
/home/arjan/dev/so-demo/build.xml:9: someid doesn't denote a SampleData
ただし、参照オブジェクトによってカプセル化されたクラスを確認すると、正しい型です。私はこれでかなりうんざりしています。他にヒントはありますか?
編集 23-11-2012 11:46:
明確なテストケースで Gist を作成しました。私の Ant のバージョンは 1.8.4 です。Sonatype Aether Antlib などの他のライブラリを調べて、彼らの推論の方法に従ったので、誰かが解決策を提供してくれることを願っています。
getCheckedRef
メソッド、特に Ant sourcefileですべてがうまくいきませんsrc\main\org\apache\tools\ant\types\DataType.java:250
。
if (!(requiredClass.isAssignableFrom(o.getClass()))) {
log("Class " + o.getClass() + " is not a subclass of " + requiredClass,
Project.MSG_VERBOSE);
String msg = ref.getRefId() + " doesn\'t denote a " + dataTypeName;
throw new BuildException(msg);
}
何が起こっている?これは私が思いついた単純なテストケースです。