web-dev-qa-db-fra.com

Eclipse: Référencement log4j.dtd dans log4j.xml

J'utilise log4j depuis un bon moment maintenant et je l'utilise généralement en haut du fichier log4j.xml (probablement comme beaucoup d'autres et, selon Google, c'est la moyen de le faire):

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

Cela fonctionne évidemment, mais Eclipse ne fournit pas son aide contextuelle pour l'écriture de XML et tout le reste. De plus, il indique toujours qu'il ne trouve pas le log4j.dtd. Maintenant, je suis curieux de savoir comment résoudre ce problème.

J'ai essayé quelques choses et ces travaux:

<!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 a échoué:

<!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 au moment de l'exécution, mais un simple log4j.dtd _ (si je ne me trompe pas), cela ne devrait donc pas poser de problème.

Quelqu'un peut-il s'il vous plaît nous éclairer?

112
sjngm

Je sais que l'on a répondu à cette question, mais j'aimerais 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">

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

L’inconvénient, 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 fois).

169
Jack Leow

Essayez d’ajouter le fichier log4j.dtd en tant qu’entrée de catalogue XML d’URI propre à l’utilisateur dans "Préférences -> XML -> Catalogue XML". Comme je le sais, c’est à cet endroit que 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 depuis leur site Web (natif).

Je l'ai fait comme ça (pour le 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 [~ # ~]

Je voudrais aller 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 Java Build Path' . Pourquoi devraient-elles travaillez dans une définition DOCTYPE? "Validez" (menu contextuel Eclipse) le fichier log4j.xml et vous recevrez un avertissement vous indiquant que le chemin ne peut pas être résolu.

J'espérais classpath:org/Apache/log4j/xml/log4j.dtd _ ferait l'affaire mais ce protocole n'est pas supporté (voir erreur de validation). Je crains que cela ne fonctionne pas hors de la boîte.

Et, si j'ai bien compris, le SYSTEM "log4j.dtd" La notation n'est pas un espace réservé. Il s'agit d'une référence valide à un document qui devrait se trouver à côté du dtd (dans ce cas).

39
FrVaBe

J'ai ajouté le dossier DTD dans webcontent, 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

2
Dileep

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 Key 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
1
Abel ANEIROS

@ Jack Leow utilise une bonne approche avec l’ID PUBLIC. Cependant, 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

Ceci fait référence à un fichier 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">
1
wbdarby