Eclipse: haciendo referencia a log4j.dtd en log4j.xml

117

He estado usando log4j durante bastante tiempo y generalmente lo uso en la parte superior de log4j.xml (probablemente como muchos otros y, según Google, esta es la forma de hacerlo):

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

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

Probé algunas cosas y estas funcionan:

<!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 puede ver desde arriba, estamos usando Maven. Por lo tanto, probé esto, pero falla:

<!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 generalmente sabe cómo lidiar con las variables de classpath, pero ¿por qué no funciona? Sé que la referencia no funcionará durante el tiempo de ejecución, pero tampoco una simple log4j.dtd(si no me equivoco), por lo que no debería ser un problema.

¿Alguien puede arrojar algo de luz sobre esto?

sjngm
fuente

Respuestas:

176

Sé que esta pregunta ha sido respondida, pero me gustaría ofrecer una 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">

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

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

Jack Leow
fuente
este enfoque es mejor que la respuesta aceptada, ya que no tiene que lidiar con la ubicación física del archivo dtd. Esto ayuda cuando comparte su proyecto con otros desarrolladores.
ases.
1
Interesante. Ahora tengo que encontrar el dtd para log4j 2.0 - ¡qué dolor!
Martin
8
en algún momento recientemente esto ha dejado de funcionar. Si ingresa en un navegador a logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/… verá que ahora hay un error xml
Kip
@Kip, tienes razón, el enlace no funciona. ¿Tienes algún enlace actualizado con alguien aquí?
mannedear
Revisé el enlace con curl y devolvió un DTD completo. Si traté de verlo en un navegador, devuelve errores. Sugeriría verificarlo con una herramienta como curl.
John Yeary
41

Intente agregar log4j.dtd como una entrada de catálogo XML URI específico del usuario en "Preferencias -> XML -> Catálogo XML". Como sé, este es el lugar donde eclipse administra las referencias a los 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 prueba) y 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

Quizás también funcione $ {M2_REPO}; no lo marqué.

Use la URL nativa en su 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

Yo iría con la solución anterior, pero para volver a su pregunta, creo que las variables de ruta de clase 'se pueden usar en una ruta de compilación de Java' . ¿Por qué deberían trabajar dentro de una definición de DOCTYPE? "Valide" (menú contextual de eclipse) el archivo log4j.xml y obtendrá una advertencia de que la ruta no se puede resolver.

Esperaba classpath:org/apache/log4j/xml/log4j.dtdque hiciera el truco, pero ese protocolo tampoco es compatible (consulte el error de validación). Me temo que no funcionará de inmediato.

Y, según entendí, la SYSTEM "log4j.dtd"notación 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).

FrVaBe
fuente
Veo lo que está diciendo, pero esto parece ser una propiedad general. Sin embargo, tenemos diferentes proyectos (algunos ni siquiera Maven-projects) y usan diferentes versiones de log4j. Sería genial si pudiera vincular un poco la configuración al proyecto.
sjngm
Si dice diferentes versiones de log4j, ¿se refiere a diferentes versiones de log4j.dtd? Entonces tienes que definir una entrada de catálogo para cada versión. Si desea vincular la configuración al proyecto, sería mejor colocar log4j.dtd junto a log4j.xml (dentro del proyecto) y que <code> SYSTEM "log4j.dtd" </code> debería funcionar (I esperanza).
Viernes
Lo siento, me refiero a una versión diferente del log4j.jarconjunto. Supongo que "log4j.dtd" es una especie de marcador de posición, ya que es un nombre tan general. - Sí, copiar el log4j.dtd junto al XML sería una solución, pero ¿es realmente una forma común de hacerlo?
sjngm
1
Y tenga en cuenta que aquí estamos hablando de una solución que no se centra en la cuestión principal.
sjngm
Lo siento, no noté que la referencia http funcionó, creo que es la mejor solución, o SYSTEM "log4j.dtd" la manera de hacerlo es una referencia dada por favor para su declaración .
Viernes
2

Agregué la carpeta DTD en el contenido web y luego copié el archivo log4j dtd en eso. luego lo intenté como abajo. Esta funcionando

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

Ruta significa aquí la ruta del proyecto como /projectname

Dileep
fuente
1

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

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

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

@Jack Leow usa un buen enfoque con el ID PÚBLICO. Sin embargo, como 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 admite una declaración DOCTYPE sin la URL completa.

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

Por lo general, Eclipse busca log4j.dtden classpath y no lo encuentra allí y, por lo tanto, el error. Podemos resolver este problema proporcionando la URL del log4j.dtdarchivo como se muestra a continuación.

<!DOCTYPE log4j:configuration SYSTEM 
      "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
Nirbhay Rana
fuente
1
Esa es una copia exacta de lo que intenté en mi pregunta.
sjngm