我寫了兩個不同的自定義Ant任務。他們試圖通過基類中的靜態成員來共享數據。這不適合我。如何在自定義Ant任務之間共享數據?
我假設我在Java中正確使用靜態成員。我認爲這是Java VM的動態加載問題。不過,我是一個與Java相關的新手。
由於Ant定製任務在運行時使用taskdef
任務進行映射,Ant構建引擎必須通過java.lang.reflect.Constructor.newInstance()動態加載此代碼。
有沒有一個把戲這個工作?
注意:這在「常規」Java代碼中工作正常......這是問題的動態加載Ant。
實例類:
import org.apache.tools.ant.Task; public class AntCustomTaskShared extends Task { private static Integer _static_bigdata = null; public Integer get_bigdata() { if (_static_bigdata == null) { log("alloc"); // from ant Task class _static_bigdata = new Integer(0); } return _static_bigdata; } }
import org.apache.tools.ant.BuildException; public class AntCustomTask1 extends AntCustomTaskShared { public void execute() throws BuildException { Integer big_data = get_bigdata(); // "alloc" is printed // do stuff with big_data log("I'm doing big stuff"); } }
import org.apache.tools.ant.BuildException; public class AntCustomTask2 extends AntCustomTaskShared { public void execute() throws BuildException { Integer big_data = get_bigdata(); // "alloc" is printed (again) // do stuff with big_data log("I'm doing big stuff again"); } }
例的Ant build.xml:
<?xml version="1.0" encoding="UTF-8"?> <project name="MyTask" basedir="." default="init"> <target name="init" description="test the custom task" > <taskdef name="CustomTask1" classname="AntCustomTask1" classpath="C:\my_custom_ant_task_class_files" /> <taskdef name="CustomTask2" classname="AntCustomTask2" classpath="C:\my_custom_ant_task_class_files" /> <CustomTask1/> <CustomTask2/> </target> </project>
做到以上的,你會看到 「黃金」 登錄兩次。我無法讓這兩個自定義任務分享「大數據」。
我在Windows上運行ant 1.8.1與這兩個ENV瓦爾:
- JAVA_HOME = C:\ Program Files文件\的Java \ jdk1.6.0_21
- CLASSPATH =(空)
提示:如果你想從一個Ant(1.8)工藝踏進這個自定義任務,在這裏設置斷點:
org.apache.tools.ant.launch.Launcher.main()
org.apache.tools.ant.UnknownElement.execute()
你可以發佈一個簡單的構建,說明這一點?我已經在本地嘗試過了,它似乎對我有用 - 沒有打印第二個分配。 – 2010-10-20 11:26:42
使用您的樣本構建我沒有兩次調用BigData構造函數。不過現在看到兩個分配:一個來自println,另一個來自記錄器。我已經將所有的課程放在一個目錄fwiw中。 – 2010-10-20 11:54:47