Eclipse: Verweisen auf log4j.dtd in log4j.xml

117

Ich benutze log4j jetzt schon eine ganze Weile und benutze es normalerweise oben in der log4j.xml (wahrscheinlich genau wie viele andere und laut Google ist dies der Weg, dies zu tun):

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

Offensichtlich funktioniert dies, aber Eclipse bietet keine kontextsensitive Hilfe zum Schreiben von XML und allem. Außerdem wird immer eine Warnung angezeigt, dass das nicht gefunden wird log4j.dtd. Jetzt bin ich gespannt, wie ich das beheben kann.

Ich habe ein paar Dinge ausprobiert und diese funktionieren:

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

Wie Sie von oben sehen können, verwenden wir Maven. Deshalb habe ich das versucht, aber es schlägt fehl:

<!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 weiß normalerweise, wie man mit den Klassenpfadvariablen umgeht, aber warum funktioniert das nicht? Ich weiß, dass die Referenz zur Laufzeit nicht funktioniert, aber auch nicht einfach log4j.dtd(wenn ich mich nicht irre), so dass dies kein Problem sein sollte.

Kann jemand bitte ein Licht darauf werfen?

sjngm
quelle

Antworten:

176

Ich weiß, dass diese Frage beantwortet wurde, möchte aber meine etwas andere Alternative anbieten:

<!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 ähnelt der Antwort von @ FrVaBe , erfordert jedoch keine weitere Eclipse-Konfiguration (dh wenn Sie Ihr Projekt mit anderen teilen oder ein großes Team haben, müssen Sie sich weniger Sorgen machen).

Der Nachteil ist jedoch, dass ich glaube, dass Sie eine Internetverbindung benötigen (zumindest irgendwann während der Entwicklung, auch wenn es nur einmal ist).

Jack Leow
quelle
Dieser Ansatz ist besser als die akzeptierte Antwort, da Sie sich nicht mit dem physischen Speicherort der dtd-Datei befassen müssen. Dies ist hilfreich, wenn Sie Ihr Projekt mit anderen Entwicklern teilen.
Asse.
1
Interessant. Jetzt muss ich die dtd für log4j 2.0 finden - was für ein Schmerz - was meine Eigenschaftendateikonfiguration zurück!
Martin
8
Vor kurzem hat dies aufgehört zu funktionieren. Wenn Sie in einem Browser zu logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/… gehen, werden Sie sehen, dass es jetzt einen XML-Fehler gibt
Kip
@Kip Sie haben Recht, Link funktioniert nicht. Hast du einen aktualisierten Link mit jemandem hier?
bemannt
Ich habe den Link mit Curl überprüft und es wurde eine vollständige DTD zurückgegeben. Wenn ich versucht habe, es in einem Browser anzuzeigen, werden Fehler zurückgegeben. Ich würde vorschlagen, es mit einem Werkzeug wie Curl zu überprüfen.
John Yeary
41

Versuchen Sie, die Datei log4j.dtd als benutzerspezifischen URI-XML-Katalogeintrag unter "Einstellungen -> XML -> XML-Katalog" hinzuzufügen. Wie ich weiß, ist dies der Ort, an dem Eclipse die Verweise auf Definitions- / Validierungsdateien (wie xsd) verwaltet. Wenn sie hier zu finden sind, benötigt eclipse keinen Internetzugang, um an ihrem nativen (Web-) Standort auf sie zugreifen zu können.

Ich habe es so gemacht (zum Test) und Eclipse beschwert sich nicht:

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

Vielleicht funktioniert auch $ {M2_REPO} - das habe ich nicht überprüft.

Verwenden Sie anschließend die native URL in Ihrer log4j.xml

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

BEARBEITEN

Ich würde mit der obigen Lösung gehen, aber um auf Ihre Frage zurückzukommen, denke ich, dass Klassenpfadvariablen 'in einem Java-Erstellungspfad verwendet werden können' . Warum sollten sie innerhalb einer DOCTYPE-Definition arbeiten? "Validieren" (Eclipse-Kontextmenü) der Datei log4j.xml und Sie erhalten eine Warnung, dass der Pfad nicht aufgelöst werden kann.

Ich hoffte, classpath:org/apache/log4j/xml/log4j.dtddass ich den Trick machen würde, aber dieses Protokoll wird auch nicht unterstützt (siehe Validierungsfehler). Ich fürchte, es wird nicht sofort funktionieren.

Und wie ich verstanden habe, ist die SYSTEM "log4j.dtd"Notation kein Platzhalter. Es ist ein gültiger Verweis auf ein Dokument, das voraussichtlich neben dem dtd gefunden wird (in diesem Fall).

FrVaBe
quelle
Ich verstehe, was Sie sagen, aber dies scheint eine allgemeine Eigenschaft zu sein. Wir haben jedoch verschiedene Projekte (einige nicht einmal Maven-Projekte) und sie verwenden verschiedene Versionen von log4j. Es wäre toll, wenn ich die Konfiguration etwas an das Projekt binden könnte.
sjngm
Wenn Sie verschiedene Versionen von log4j sagen - meinen Sie verschiedene Versionen von log4j.dtd? Dann müssen Sie für jede Version einen Katalogeintrag definieren. Wenn Sie die Konfiguration an das Projekt binden möchten, ist es möglicherweise am besten, die Datei log4j.dtd neben der Datei log4j.xml (innerhalb des Projekts) zu platzieren, und dann sollte <code> SYSTEM "log4j.dtd" </ code> funktionieren (I. Hoffnung).
FrVaBe
Entschuldigung, ich meinte eine andere Version von log4j.jarals Ganzes. Ich gehe davon aus, dass "log4j.dtd" eine Art Platzhalter ist, da es sich um einen so allgemeinen Namen handelt. - Ja, das Kopieren von log4j.dtd neben XML wäre eine Lösung, aber ist dies wirklich eine übliche Methode?
sjngm
1
Und bitte beachten Sie, dass es sich hier um eine Lösung handelt, die nicht auf die Hauptfrage abzielt.
sjngm
Es tut uns leid, dass ich nicht bemerkt habe, dass die http-Referenz funktioniert hat - ich denke, es ist die beste Lösung - oder dass die von Ihnen angegebene Referenz für Ihre Aussage SYSTEM "log4j.dtd" der Weg ist, dies zu tun .
FrVaBe
2

Ich habe den DTD-Ordner im Webinhalt hinzugefügt und dann die log4j dtd-Datei darin kopiert. dann habe ich es wie unten versucht. Es funktioniert

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

Pfad bedeutet hier den Projektpfad wie /projectname

Dileep
quelle
1

Ich habe es mit der Antwort von FrVaBe versucht, aber es hat bei mir nicht funktioniert und ich habe eine kleine Änderung am Schlüsselwert vorgenommen und es funktioniert.

"Einstellungen -> XML -> XML-Katalog"

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

@ Jack Leow verwendet einen guten Ansatz mit der PUBLIC ID. Er weist jedoch darauf hin, dass eine Netzwerkverbindung erforderlich ist.

Ich bevorzuge eine Kombination:

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

Dies verweist auf eine lokale JAR und unterstützt eine DOCTYPE-Deklaration ohne die vollständige URL.

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

Normalerweise sucht Eclipse log4j.dtdim Klassenpfad und findet es dort nicht und daher den Fehler. Wir können dieses Problem beheben, indem wir eine URL für die log4j.dtdDatei wie unten angeben.

<!DOCTYPE log4j:configuration SYSTEM 
      "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
Nirbhay Rana
quelle
1
Das ist eine genaue Kopie dessen, was ich in meiner Frage versucht habe.
sjngm