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