2010-10-20 149 views
5

我寫了兩個不同的自定義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()
+0

你可以發佈一個簡單的構建,說明這一點?我已經在本地嘗試過了,它似乎對我有用 - 沒有打印第二個分配。 – 2010-10-20 11:26:42

+0

使用您的樣本構建我沒有兩次調用BigData構造函數。不過現在看到兩個分配:一個來自println,另一個來自記錄器。我已經將所有的課程放在一個目錄fwiw中。 – 2010-10-20 11:54:47

回答

1

該解決方案很簡單,但在Ant網站上記錄得很差(或沒有?)。 (我會爲Ant文檔提交補丁以糾正這種情況!)

我需要在taskdef節點上使用屬性loaderref。該令牌用於引用ClassLoader(並共享它)。之後,正確地在自定義任務之間共享靜態成員。

修正的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" 
       loaderref="my_shared_class_loader" 
     /> 
     <taskdef name="CustomTask2" 
       classname="AntCustomTask2" 
       classpath="C:\my_custom_ant_task_class_files" 
       loaderref="my_shared_class_loader" 
     /> 
     <CustomTask1/> 
     <CustomTask2/> 
    </target> 
</project> 
+0

我仍然沒有在Ant的文檔中看到這個用法的描述。你最終提交了補丁嗎? – gkb0986 2014-09-29 01:51:54

0

這是不太優雅,但你可以嘗試通過System.setPropertySystem.getProperty調用共享的信息。 ANT類加載與普通的Java應用程序完全不同。