2010-10-20 13 views
5

Escribí dos tareas Ant diferentes personalizadas. Están tratando de compartir datos a través de un miembro estático en una clase base. Esto no funciona para mí¿Cómo comparto datos entre tareas Ant personalizadas?

Supongo que estoy usando miembros estáticos correctamente en Java. Creo que esto es un problema de carga dinámica con Java VM. Sin embargo, soy relativamente novato con Java.

Dado que las tareas personalizadas de Ant se asignan en tiempo de ejecución mediante la tarea taskdef, el motor de compilación Ant debe cargar dinámicamente este código a través de java.lang.reflect.Constructor.newInstance().

¿Hay algún truco para que esto funcione?

Nota: Esto funciona bien en código Java "normal" ... es la carga dinámica de Ant que es el problema.

clases Ejemplo:

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

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

Haz todo lo anterior y verá "alloc" registra dos veces. No puedo obtener estas dos tareas personalizadas para compartir el "Big Data".

estoy corriendo hormiga 1.8.1 en Windows con estos dos env vars:

  • JAVA_HOME = C: \ Archivos de programa \ Java \ jdk1.6.0_21
  • CLASSPATH = (vacío)

Consejo: Si quieres entrar en esta tarea personalizada de un proceso de hormiga (1.8), establece los puntos de interrupción aquí:

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

Podría publicar una construcción simple que ilustra esto? Intenté esto localmente y parece funcionar para mí, no se imprime una segunda asignación. –

+0

Usando su compilación de muestra no recibo dos llamadas al constructor BigData. Ahora veo dos allocs: uno de println y otro de logger. Tengo todas las clases en un directorio desde ahora. –

Respuesta

1

La solución es simple, pero está mal (¿o no?) Documentada en el sitio web Ant. (Voy a enviar un parche a los documentos Ant para corregir esta situación!)

Necesito usar el atributo loaderref en los nodos taskdef. El token se utiliza para hacer referencia al ClassLoader (y compartirlo). Después, los miembros estáticos se comparten entre tareas personalizadas correctamente.

corregido 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

Todavía no veo la descripción de este uso en la documentación de Ant. ¿Enviaste un parche al final? – gkb0986

0

Esto es menos elegante, pero se podría tratar de compartir la información a través de los System.setProperty y System.getProperty llamadas. La carga de la clase ANT es definitivamente diferente de una aplicación Java normal.

Cuestiones relacionadas