2011-02-15 21 views
105

He estado usando log4j desde hace bastante tiempo y normalmente lo uso en la parte superior de log4j.xml (probablemente igual que muchos otros y según Google esto es la forma de hacerlo):Eclipse: Hace referencia a log4j.dtd en log4j.xml

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> 

Obviamente esto está funcionando, sin embargo Eclipse no proporciona su ayuda sensible al contexto para escribir el XML y todo. Además, siempre muestra una advertencia de que no encuentra el log4j.dtd. Ahora tengo curiosidad por cómo solucionar esto.

he intentado un par de cosas y estos trabajos:

<!DOCTYPE log4j:configuration SYSTEM "jar:file:/path/.m2/repository/log4j/log4j/1.2.14/log4j-1.2.14.jar!/org/apache/log4j/xml/log4j.dtd"> 
<!DOCTYPE log4j:configuration SYSTEM "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd"> 

Como se puede ver desde arriba que estamos utilizando Maven. Por lo tanto, he intentado esto, pero fracasa:

<!DOCTYPE log4j:configuration SYSTEM "jar:file:${M2_REPO}/log4j/log4j/1.2.14/log4j-1.2.14.jar!/org/apache/log4j/xml/log4j.dtd"> 

Eclipse por lo general sabe cómo hacer frente a las variables de ruta de clases, pero ¿por qué no lo hace este trabajo? Sé que la referencia no funcionará durante el tiempo de ejecución, pero tampoco lo hace un simple log4j.dtd (si no estoy equivocado), así que eso no debería ser un problema.

¿Alguien puede por favor arrojar luz sobre esto?

+4

+1 bien escrito! – Nishant

Respuesta

157

Sé que esta pregunta ha sido contestada, pero me gustaría ofrecer mi alternativa ligeramente diferente:

<!DOCTYPE log4j:configuration PUBLIC 
    "-//APACHE//DTD LOG4J 1.2//EN" "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd"> 

Se está similar a @FrVaBe's response, pero en el lado positivo, no requiere ninguna otra configuración de Eclipse (es decir, si comparte su proyecto con otros o tiene un equipo grande, es una cosa menos de la que preocuparse).

Sin embargo, el inconveniente es que creo que significa que necesitará una conexión a Internet (al menos en algún momento durante el desarrollo, aunque sea solo una vez).

+0

este enfoque es mejor que la respuesta aceptada, ya que no tiene que ocuparse de la ubicación física del archivo dtd. Esto ayuda al compartir su proyecto con otros desarrolladores. –

+1

Interesante. Ahora tengo que encontrar el dtd para log4j 2.0 - ¡qué dolor! ¡Cuál es la configuración de mi archivo de propiedades! – Martin

+0

Gran respuesta +1 para ese – OO7

36

Intente agregar el log4j.dtd como una entrada de catálogo XML de URI específico del usuario en "Preferencias -> XML -> Catálogo XML". Como sé, este es el lugar donde eclipse gestiona las referencias a archivos de definición/validación (como xsd). Si se pueden encontrar aquí, eclipse no necesita acceso a Internet para acceder a ellos en su ubicación nativa (web).

lo hice así (para la prueba) y el eclipse no se queja:

Entry element: URI 
Location:   C:\Users\me\Desktop\log4j.dtd 
URI:    file:///C:/Users/me/Desktop/log4j.dtd 
Key type:   URI 
Key:    http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd 

Tal vez también $ {} M2_REPO funciona - Yo no comprobar esto.

utilizar la dirección URL en su nativa log4j.xml después

<!DOCTYPE log4j:configuration SYSTEM "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd"> 

EDITAR

Me gustaría ir con la solución anterior, pero para volver a su pregunta, creo variables de ruta de clase 'can be used in a Java Build Path'. ¿Por qué deberían funcionar dentro de una definición DOCTYPE? "Validar" (eclipse context menu) el archivo log4j.xml y recibirá una advertencia de que la ruta no se puede resolver.

Esperaba que classpath:org/apache/log4j/xml/log4j.dtd hiciera el truco pero ese protocolo tampoco es compatible (ver error de validación). Me temo que no funcionará de la caja.

Y, según entiendo, la notación SYSTEM "log4j.dtd" no es un marcador de posición. Es una referencia válida a un documento que se espera que se encuentre junto al dtd (en este caso).

+0

Veo lo que dices, pero esto parece ser una propiedad general. Sin embargo, tenemos diferentes proyectos (algunos incluso Maven-projects) y usan diferentes versiones de log4j. Sería genial si pudiera unir la configuración al proyecto. – sjngm

+0

Si dices diferentes versiones de log4j, ¿te refieres a diferentes versiones de log4j.dtd? De lo que debe definir una entrada de catálogo para cada versión. Si desea vincular la configuración al proyecto, sería mejor colocar el log4j.dtd al lado del log4j.xml (dentro del proyecto) y que el SYSTEM "log4j.dtd" debería funcionar (espero). – FrVaBe

+0

Lo siento, me refería a una versión diferente del 'log4j.jar' como un todo. Supongo que "log4j.dtd" es un tipo de marcador de posición, ya que es un nombre tan general. - Sí, copiar log4j.dtd al lado del XML sería una solución, pero ¿es esta una forma común de hacerlo? – sjngm

2

Agregué la carpeta DTD en webcontent y luego copié el archivo log4j dtd en eso. entonces intenté como abajo.Su trabajo

<!DOCTYPE log4j:configuration SYSTEM "<Path>/DTD/log4j.dtd"> 

camino significa aquí la ruta del proyecto como /projectname

1

He intentado con la respuesta de FrVaBe pero no funcionó para mí e hice un pequeño cambio en el valor Key y funciona.

"Preferencias -> XML - Catálogo> XML"

Localization: C:\Users\me\Desktop\log4j.dtd 
Key Type: URI 
Key: -//APACHE//DTD LOG4J 1.2//EN 
1

@Jack Leow utiliza un buen acercamiento con el ID PÚBLICA. Sin embargo, como él señala, requiere una conexión de red.

prefiero una combinación:

Entry element:  Public 
Location:   org\apache\log4j\xml\log4j.dtd in jar file C:\Development\lib\external\apache-log4j-1.2.17\log4j-1.2.17.jar 
URI:    jar:file:/C:/Development/lib/external/apache-log4j-1.2.17/log4j-1.2.17.jar!/org/apache/log4j/xml/log4j.dtd 
Key type:   Public ID 
Key:    -//APACHE//DTD LOG4J 1.2//EN 

Esto hace referencia a un JAR local y es compatible con una declaración DOCTYPE sin la URL completa.

<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd"> 
-1

Por lo general, Eclipse busca log4j.dtd en la ruta de clase y no lo encuentra allí y por lo tanto el error. Podemos resolver este problema proporcionando URL para el archivo log4j.dtd como a continuación.

<!DOCTYPE log4j:configuration SYSTEM 
     "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd"> 
+0

Esa es una copia exacta de lo que probé en mi pregunta. – sjngm

Cuestiones relacionadas