2010-10-20 18 views
5

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()
+0

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

+0

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

Odpowiedz

1

Rozwiązanie jest proste, ale słabo (lub nie?) Udokumentowane na stronie Ant. (Poproszę łatkę do dokumentów Ant, aby poprawić tę sytuację!)

Potrzebowałem użyć atrybutu loaderref na węzłach taskdef. Token służy do odwoływania się do ClassLoader (i udostępniania go). Po tym, statyczni członkowie są poprawnie dzieleni między zadaniami niestandardowymi.

Poprawione 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

Nadal nie widzę opisu tego użycia w dokumentacji dla Ant. Czy przesłałeś łatkę na końcu? – gkb0986

0

To mniej eleganckie, ale można spróbować udostępnienia informacji za pośrednictwem System.setProperty i System.getProperty połączeń. Ładowanie klasy ANT zdecydowanie różni się od normalnej aplikacji Java.

Powiązane problemy