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()
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. –
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. –