Napisałem dwa różne niestandardowe zadania Ant. Próbują udostępniać dane przez statyczny element członkowski w klasie bazowej. To nie działa dla mnie.Jak udostępnić dane między niestandardowymi zadaniami Ant?
Zakładam, że używam statycznych elementów poprawnie w Javie. Myślę, że jest to problem z ładowaniem dynamicznym w maszynie wirtualnej Java. Jednak jestem względną nowicjuszką w Javie.
Ponieważ zadania niestandardowe Ant są odwzorowywane w środowisku wykonawczym za pomocą zadania taskdef
, mechanizm budowy Ant musi dynamicznie załadować ten kod za pośrednictwem metody java.lang.reflect.Constructor.newInstance().
Czy jest jakaś sztuczka, aby to zadziałało?
Uwaga: To działa dobrze w "zwykłym" kodzie Java ... jest to dynamiczne ładowanie Ant, które jest problemem.
Przykładowe ćwiczenia:
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"); } }
Przykład 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>
Czy wszystkie powyższe, a zobaczysz "Alloc" rejestrowane dwukrotnie. Nie mogę uzyskać tych dwóch niestandardowych zadań, aby udostępnić "duże dane".
używam Ant 1.8.1 na Windows z tymi dwoma env vars:
- JAVA_HOME = C: \ Program Files \ Java \ jdk1.6.0_21
- CLASSPATH = (pusty)
Podpowiedź: Jeśli chcesz, aby wejść do tego niestandardowego zadania z Ant (1.8) procesu, ustawić punkty przerwania tutaj:
org.apache.tools.ant.launch.Launcher.main()
org.apache.tools.ant.UnknownElement.execute()
można umieścić prosty build, który ilustruje to? Próbowałem to lokalnie i wydaje się, że działa dla mnie - nie ma drugiego przydziału jest drukowany. –
Korzystając z przykładowej kompilacji, nie otrzymuję dwóch wywołań do konstruktora BigData. Widzimy teraz teraz dwa alokatywy: jeden z println i jeden z loggera. Mam wszystkie klasy w jednym katalogu fwiw. –