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

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, esta es la manera de hacerlo):

 

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 cómo solucionar esto.

Intenté algunas cosas y estos funcionan:

   

Como puede ver desde arriba, estamos usando Maven. Por lo tanto, probé esto, pero falla:

  

Eclipse generalmente sabe cómo manejar las variables classpath, pero ¿por qué no funciona? Sé que la referencia no funcionará durante el tiempo de ejecución, pero tampoco lo hace un simple log4j.dtd (si no estoy equivocado), por lo que no debería ser un problema.

¿Alguien puede por favor arrojar luz sobre esto?

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

  

Es similar a la respuesta de @ FrVaBe , pero en el lado positivo, no requiere más 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, la desventaja es que creo que significa que necesitarás una conexión a Internet (al menos en algún momento durante el desarrollo, incluso si solo es una vez).

Intente agregar 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 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 

Tal vez también funcione $ {M2_REPO} – No verifiqué esto.

Use la URL nativa en su log4j.xml luego

  

EDITAR

Me gustaría ir con la solución anterior, pero para volver a su pregunta, creo que las variables de la ruta de clase ‘se pueden usar en una ruta de comstackción de Java’ . ¿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, como entendí, 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).

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

 /DTD/log4j.dtd"> 

La ruta significa aquí la ruta del proyecto como /projectname

Lo intenté con la respuesta de FrVaBe, pero no funcionó, e hice un pequeño cambio en el valor de la clave y funcionó.

“Preferencias -> XML -> Catálogo XML”

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

@Jack Leow usa un buen enfoque con el ID PÚBLICO. 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 admite una statement DOCTYPE sin la URL completa.

  

Por lo general, Eclipse busca log4j.dtd en classpath 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.