2009-01-26 10 views
5

Tengo un archivo de compilación que como parte del proceso de compilación se basa en varias tareas. Estos elementos taskdef (por ejemplo, webdoclet y jasper2) usan log4j como registrador. Idealmente, me gustaría poder proporcionar un archivo de configuración de log4j diferente para cada uno, pero como mínimo, me gustaría poder especificar qué archivo de configuración de log4j se utiliza.¿Cómo puedo proporcionar un log4j.xml personalizado para diferentes tareas de hormiga?

Lo que solía hacer era poner en la parte delantera de la ruta de clase el directorio que contenía el archivo log4j.xml que quería que utilizara taskdef. Por ejemplo:

 
<target name="define.jasper2"> 
    <path id="jspc.classpath"> 
     <!-- Put this FIRST so Jasper will find the log4j.xml in the Build directory --> 
     <pathelement location="Build"/> 
     <fileset dir="${tomcat.libs}"> 
      .... 
     </fileset> 
     <pathelement location="${log4j.jar}"/> 
     .... 
    </path> 

    <taskdef name="jasper2" classname="org.apache.jasper.JspC" classpathref="jspc.classpath"/> 
</target> 

He verificado que, de hecho, el directorio "Build" es en la parte delantera de la ruta de clases y que existe una log4j.xml en ese directorio. Sin embargo, cuando ejecuto ant en modo detallado con log4j en la depuración, veo que log4j está eligiendo el log4j.xml que está en el directorio de trabajo actual , que no es el que yo quiero. Parece que Log4j no está utilizando classpath para resolver el log4j.xml predeterminado.

Estoy usando log4j 1.2.8 (incrustado en un marco más grande, por lo que no puedo actualizarlo) y algunas de estas tareas parecen depender de commons-logging 1.0.3. El proceso de compilación usa Sun Java 5.

Si yo set ANT_OPTS=-Dlog4j.configuration=Build/log4j.xml antes de ejecutar la hormiga, las taskdefs cargan correctamente el log4j.xml deseado.

Colocando el directorio "Build" al frente de la ruta de clase para las taskdefs utilizadas para trabajar. No sé qué cambió. ¿Cómo puedo restaurar el comportamiento donde puedo controlar, dentro de build.xml, qué archivo de configuración de log4j se usa para una tarea determinada? ¿Hay alguna otra manera que no sea establecer ANT_OPTS y que no sea reorganizar los archivos para mover el log4j.xml de la aplicación fuera del directorio de trabajo actual para que log4j encuentre el archivo log4j.xml correcto?

Respuesta

0

¿Se puede mover el archivo log4j.xml que está en el directorio de trabajo actual?

+0

que realmente preferiría no tener que mover cualquier archivo alrededor. – Eddie

2

Log4j carga su configuración buscando la propiedad del sistema log4j.configuration. En su defecto, busca log4j.properties o log4j.xml en classpath.

En algunas tareas de hormiga que bifurcan una nueva JVM, puede especificar la propiedad del sistema log4j.configuration con < jvmarg/> etiqueta. Sin embargo, en aquellos que no lo hacen, su mejor opción es crear una entrada classpath cuya primera entrada sea la configuración log4j que le gustaría usar.

+0

Bueno, estoy haciendo lo que sugiere: creo una entrada classpath cuya primera entrada es la (directorio que contiene la) configuración log4j para usar. Esto solía funcionar, pero ahora no. Si pongo el archivo log4j.xml en classpath, aún no funciona. – Eddie

+0

Parece que la tarea jasper2 admite el elemento "fork", ¿puede establecer eso como verdadero e intentar usar jvmarg? – Kevin

+0

use los argumentos -verbose y -debug al iniciar la hormiga, quizás la información adicional sea útil sobre por qué falla –

0

Si configuro ANT_OPTS = -Dlog4j.configuration = Build/log4j.xml antes de ejecutar ant, las taskdefs cargan correctamente el log4j.xml deseado.

¿Ha intentado configurar esta propiedad utilizando sysproperty?

debería ser algo como esto:

<target name="define.jasper2"> 
    <sysproperty key="log4j.configuration" value="Build/log4j.xml"/> 
    ... 
</target> 
+0

Desafortunadamente, al menos en Ant 1.7.0, no puede usar sysproperty dentro de taskdef ni de forma independiente en un destino. Entonces esto no funciona. – Eddie

3

soy capaz de especificar un archivo de configuración utilizando una dirección de fichero en relación con sysproperty así:

<java classname="com.lunatech.MainClass"> 
    <sysproperty key="log4j.configuration" value="file:src/log4j-debug.properties"/> 
    <classpath refid="runtime.classpath"/> 
</java> 
Cuestiones relacionadas