2010-10-20 5 views
5

Tôi đã viết hai tác vụ Ant tùy chỉnh khác nhau. Họ đang cố gắng chia sẻ dữ liệu thông qua một thành viên tĩnh trong một lớp cơ sở. Điều này không làm việc cho tôi.Làm cách nào để chia sẻ dữ liệu giữa các tác vụ Ant tùy chỉnh?

Tôi giả sử tôi đang sử dụng các thành viên tĩnh chính xác trong Java. Tôi nghĩ rằng đây là một vấn đề tải động với máy ảo Java. Tuy nhiên, tôi là một newbie tương đối với Java.

Vì tác vụ tùy chỉnh Ant được ánh xạ vào thời gian chạy bằng cách sử dụng tác vụ taskdef, công cụ xây dựng Ant phải tải động mã này qua java.lang.reflect.Constructor.newInstance().

Có một mẹo để thực hiện công việc này không?

Lưu ý: Điều này làm việc tốt trong mã Java "thông thường" ... đó là tải động của Ant là vấn đề.

Ví dụ lớp:

 
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"); 
    } 
} 

Ví dụ 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> 

Có phải tất cả những điều trên và bạn sẽ thấy "alloc" đăng nhập hai lần. Tôi không thể có được hai nhiệm vụ tùy chỉnh này để chia sẻ "dữ liệu lớn".

Tôi đang chạy ant 1.8.1 trên Windows với hai env những vars:

  • JAVA_HOME = C: \ Program Files \ Java \ jdk1.6.0_21
  • CLASSPATH = (trống)

Gợi ý: Nếu bạn muốn bước vào nhiệm vụ tùy chỉnh này từ một (1,8) quá trình Ant, đặt breakpoint của bạn ở đây:

  • org.apache.tools.ant.launch.Launcher.main()
  • org.apache.tools.ant.UnknownElement.execute()
+0

bạn có thể gửi một xây dựng đơn giản để minh họa điều này? Tôi đã thử địa phương này và nó xuất hiện để làm việc cho tôi - không có cấp phát thứ hai được in. –

+0

Sử dụng bản dựng mẫu của bạn Tôi không nhận được hai cuộc gọi tới hàm tạo BigData. Do thấy hai allocs bây giờ mặc dù: một từ println, và một từ logger. Tôi có tất cả các lớp trong một thư mục fwiw. –

Trả lời

1

Giải pháp đơn giản nhưng kém (hoặc không?) Được ghi lại trên trang web Ant. (Tôi sẽ gửi một bản vá cho tài liệu Ant để sửa lại tình huống này!)

Tôi cần sử dụng thuộc tính loaderref trên các nút taskdef. Mã thông báo được sử dụng để tham chiếu ClassLoader (và chia sẻ nó). Sau đó, các thành viên tĩnh được chia sẻ giữa các tác vụ tùy chỉnh một cách chính xác.

Corrected build.xml Ant:

 
<?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

Tôi vẫn không thấy mô tả về việc sử dụng này trong tài liệu dành cho Ant. Bạn có gửi bản vá cuối cùng không? – gkb0986

0

Đây là ít thanh lịch, nhưng bạn có thể thử chia sẻ thông tin thông qua System.setPropertySystem.getProperty cuộc gọi. Việc nạp lớp ANT chắc chắn là khác nhau sau đó là một ứng dụng Java bình thường.