Eclipse: référencement de log4j.dtd dans log4j.xml

117

J'utilise log4j depuis un certain temps maintenant et j'utilise généralement ceci en haut du log4j.xml (probablement comme beaucoup d'autres et selon Google, c'est la façon de le faire):

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

Évidemment, cela fonctionne, mais Eclipse ne fournit pas son aide contextuelle pour écrire le XML et tout. De plus, il affiche toujours un avertissement indiquant qu'il ne trouve pas le fichier log4j.dtd. Maintenant, je suis curieux de savoir comment résoudre ce problème.

J'ai essayé quelques choses et celles-ci fonctionnent:

<!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">

Comme vous pouvez le voir ci-dessus, nous utilisons Maven. Par conséquent, j'ai essayé ceci, mais cela échoue:

<!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 sait généralement comment gérer les variables de chemin de classe, mais pourquoi cela ne fonctionne-t-il pas? Je sais que la référence ne fonctionnera pas pendant l'exécution, mais pas non plus une simple log4j.dtd(si je ne me trompe pas), donc cela ne devrait pas être un problème.

Quelqu'un peut-il s'il vous plaît faire la lumière à ce sujet?

sjngm
la source

Réponses:

176

Je sais que cette question a reçu une réponse, mais j'aimerais vous proposer une alternative légèrement différente:

<!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">

C'est similaire à la réponse de @ FrVaBe , mais du côté positif, ne nécessite aucune configuration Eclipse supplémentaire (c'est-à-dire que si vous partagez votre projet avec d'autres, ou avez une grande équipe, c'est une chose de moins à craindre).

L'inconvénient cependant, c'est que je pense que cela signifie que vous aurez besoin d'une connexion Internet (au moins à un moment donné pendant le développement, même si ce n'est qu'une seule fois).

Jack Leow
la source
cette approche est meilleure que la réponse acceptée, car vous n'avez pas à gérer l'emplacement physique du fichier dtd. Cela aide lors du partage de votre projet avec d'autres développeurs.
as.
1
Intéressant. Maintenant, je dois trouver le dtd pour log4j 2.0 - quelle douleur - quelle configuration de fichier de propriété!
Martin
8
quelque temps récemment, cela a cessé de fonctionner. Si vous allez dans un navigateur à logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/ ... vous verrez qu'il y a maintenant une erreur xml
Kip le
@Kip vous avez raison, le lien ne fonctionne pas. Vous avez un lien mis à jour avec quelqu'un ici?
mannedear
J'ai vérifié le lien avec curl et il a renvoyé une DTD complète. Si j'essaye de le regarder dans un navigateur, il renvoie des erreurs. Je suggérerais de le vérifier avec un outil comme curl.
John Yeary
41

Essayez d'ajouter log4j.dtd en tant qu'entrée de catalogue XML URI spécifique à l'utilisateur dans "Préférences -> XML -> Catalogue XML". Comme je le sais, c'est l'endroit où eclipse gère les références aux fichiers de définition / validation (comme xsd). S'ils peuvent être trouvés ici, eclipse n'a pas besoin d'un accès Internet pour y accéder sur leur emplacement natif (Web).

Je l'ai fait comme ça (pour test) et eclipse ne se plaint pas:

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

Peut-être aussi que $ {M2_REPO} fonctionne - je n'ai pas vérifié cela.

Utilisez ensuite l'URL native dans votre log4j.xml

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

ÉDITER

J'irais avec la solution ci-dessus mais pour revenir à votre question, je pense que les variables de chemin de classe «peuvent être utilisées dans un chemin de construction Java» . Pourquoi devraient-ils fonctionner dans une définition DOCTYPE? "Validez" (menu contextuel de l'éclipse) le fichier log4j.xml et vous obtiendrez un avertissement indiquant que le chemin ne peut pas être résolu.

J'espérais classpath:org/apache/log4j/xml/log4j.dtdfaire l'affaire mais ce protocole n'est pas non plus pris en charge (voir erreur de validation). J'ai peur que cela ne fonctionne pas dès le départ.

Et, comme je l'ai compris, la SYSTEM "log4j.dtd"notation n'est pas un espace réservé. Il s'agit d'une référence valide à un document que l'on s'attend à trouver à côté du dtd (dans ce cas).

FrVaBe
la source
Je vois ce que vous dites, mais cela semble être une propriété globale. Cependant, nous avons différents projets (certains pas même des projets Maven) et ils utilisent différentes versions de log4j. Ce serait formidable si je pouvais un peu lier la configuration au projet.
sjngm
Si vous dites différentes versions de log4j - voulez-vous dire différentes versions de log4j.dtd? Ensuite, vous devez définir une entrée de catalogue pour chaque version. Si vous souhaitez lier la configuration au projet, il peut être préférable de placer le log4j.dtd à côté du log4j.xml (à l'intérieur du projet) et que <code> SYSTEM "log4j.dtd" </code> devrait fonctionner (je espérer).
FrVaBe
Désolé, je voulais dire une version différente de l' log4j.jarensemble. Je suppose que "log4j.dtd" est une sorte de paramètre fictif car c'est un nom si général. - Oui, copier le log4j.dtd à côté du XML serait une solution, mais est-ce vraiment une manière courante de le faire?
sjngm
1
Et s'il vous plaît noter que nous parlons ici d'une solution qui ne cible pas la question principale.
sjngm
Désolé, je n'ai pas remarqué que la référence http fonctionnait - je pense que c'est la meilleure solution - ou que la référence donnée pour votre déclaration SYSTEM "log4j.dtd" est la façon de le faire .
FrVaBe
2

J'ai ajouté le dossier DTD dans le contenu Web, puis j'ai copié le fichier log4j dtd dans celui-ci. alors j'ai essayé comme ci-dessous. Ça marche

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

Chemin signifie ici le chemin du projet comme /projectname

Dileep
la source
1

J'ai essayé avec la réponse de FrVaBe mais cela n'a pas fonctionné pour moi et j'ai fait un petit changement dans la valeur de la clé et cela fonctionne.

"Préférences -> XML -> Catalogue XML"

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

@Jack Leow utilise une bonne approche avec l'ID PUBLIC. Pourtant, comme il le souligne, cela nécessite une connexion réseau.

Je préfère une combinaison:

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

Cela fait référence à un JAR local et prend en charge une déclaration DOCTYPE sans l'URL complète.

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

Habituellement, Eclipse recherche log4j.dtddans classpath et il ne le trouve pas là-bas et donc l'erreur. Nous pouvons résoudre ce problème en fournissant une URL pour le log4j.dtdfichier comme ci-dessous.

<!DOCTYPE log4j:configuration SYSTEM 
      "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
Nirbhay Rana
la source
1
C'est une copie exacte de ce que j'ai essayé dans ma question.
sjngm