Eclipse: odniesienie do log4j.dtd w log4j.xml

117

Używam log4j już od jakiegoś czasu i zwykle używam go na górze log4j.xml (prawdopodobnie tak jak wiele innych i według Google jest to sposób na zrobienie tego):

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

Oczywiście to działa, jednak Eclipse nie zapewnia pomocy kontekstowej do pisania XML i wszystkich innych. Ponadto zawsze wyświetla ostrzeżenie, że nie znajduje pliku log4j.dtd. Teraz jestem ciekawy, jak to naprawić.

Spróbowałem kilku rzeczy i te działają:

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

Jak widać z góry, używamy Mavena. Dlatego próbowałem tego, ale się nie udaje:

<!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 zwykle wie, jak radzić sobie ze zmiennymi ścieżki klas, ale dlaczego to nie działa? Wiem, że odniesienie nie będzie działać w czasie wykonywania, ale nie jest to proste log4j.dtd(jeśli się nie mylę), więc nie powinno to stanowić problemu.

Czy ktoś może rzucić na to światło?

sjngm
źródło

Odpowiedzi:

176

Wiem, że udzielono odpowiedzi na to pytanie, ale chciałbym przedstawić moją nieco inną alternatywę:

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

Jest podobny do odpowiedzi @ FrVaBe , ale z drugiej strony nie wymaga dalszej konfiguracji Eclipse (tj. Jeśli dzielisz swój projekt z innymi lub masz duży zespół, to jedna rzecz mniej, o którą musisz się martwić).

Wadą jest jednak to, że uważam, że oznacza to, że będziesz potrzebować połączenia z Internetem (przynajmniej w pewnym momencie podczas tworzenia, nawet jeśli jest to tylko jeden raz).

Jack Leow
źródło
to podejście jest lepsze niż zaakceptowana odpowiedź, ponieważ nie musisz zajmować się fizyczną lokalizacją pliku dtd. To pomaga, gdy udostępniasz swój projekt innym programistom.
asy.
1
Ciekawy. Teraz muszę znaleźć dtd dla log4j 2.0 - jaki ból - jaka konfiguracja mojego pliku właściwości z powrotem!
Martin,
8
niedawno to przestało działać. Jeśli przejdziesz w przeglądarce do logowania.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/ ... zobaczysz, że jest teraz błąd xml
Kip
@Kip masz rację, link nie działa. Masz jakieś zaktualizowane łącze z kimś tutaj?
mannedear
Sprawdziłem link za pomocą curl i zwróciło kompletne DTD. Jeśli spróbowałem spojrzeć na to w przeglądarce, zwraca błędy. Sugerowałbym sprawdzenie tego narzędziem takim jak curl.
John Yeary
41

Spróbuj dodać log4j.dtd jako wpis katalogu XML URI określonego użytkownika w „Preferencjach -> XML -> Katalog XML”. Jak wiem, jest to miejsce, w którym eclipse zarządza odwołaniami do plików definicji / walidacji (np. Xsd). Jeśli można je znaleźć tutaj, zaćmienie nie potrzebuje dostępu do Internetu, aby uzyskać do nich dostęp w ich rodzimej (internetowej) lokalizacji.

Zrobiłem to tak (do testu) i zaćmienie nie narzeka:

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

Może działa też $ {M2_REPO} - nie sprawdzałem tego.

Następnie użyj natywnego adresu URL w swoim log4j.xml

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

EDYTOWAĆ

Poszedłbym z powyższym rozwiązaniem, ale wracając do twojego pytania, myślę, że zmienne ścieżki klas „mogą być używane w ścieżce budowania Java” . Dlaczego powinny działać w ramach definicji DOCTYPE? „Sprawdź poprawność” (menu kontekstowe eclipse) pliku log4j.xml, a otrzymasz ostrzeżenie, że ścieżki nie można znaleźć.

Miałem nadzieję, classpath:org/apache/log4j/xml/log4j.dtdże załatwi sprawę, ale ten protokół również nie jest obsługiwany (patrz błąd walidacji). Obawiam się, że nie zadziała po wyjęciu z pudełka.

I, jak zrozumiałem, SYSTEM "log4j.dtd"notacja nie jest symbolem zastępczym. Jest to prawidłowe odniesienie do dokumentu, który powinien znajdować się obok dtd (w tym przypadku).

FrVaBe
źródło
Rozumiem, co mówisz, ale wydaje się, że jest to ogólna właściwość. Jednak mamy różne projekty (niektóre nawet nie Maven-projekty) i używają one różnych wersji log4j. Byłoby wspaniale, gdybym mógł nieco powiązać konfigurację z projektem.
sjngm
Jeśli mówisz o różnych wersjach log4j - czy masz na myśli różne wersje log4j.dtd? Następnie musisz zdefiniować wpis katalogu dla każdej wersji. Jeśli chcesz powiązać konfigurację z projektem, najlepiej będzie umieścić plik log4j.dtd obok log4j.xml (wewnątrz projektu) i wtedy <code> SYSTEM "log4j.dtd" </code> powinien działać (ja nadzieja).
FrVaBe
Przepraszam, miałem na myśli inną wersję log4j.jarcałości. Zakładam, że "log4j.dtd" jest swego rodzaju symbolem zastępczym, ponieważ jest taką ogólną nazwą. - Tak, skopiowanie log4j.dtd obok XML byłoby rozwiązaniem, ale czy to naprawdę powszechny sposób na zrobienie tego?
sjngm
1
I proszę zauważyć, że mówimy tutaj o rozwiązaniu, które nie jest ukierunkowane na główne pytanie.
sjngm
Przepraszam, że nie zauważyłem, że odwołanie http działa - myślę, że jest to najlepsze rozwiązanie - lub poproś o podanie odniesienia do twojego oświadczenia, SYSTEM "log4j.dtd" aby to zrobić .
FrVaBe
2

Dodałem folder DTD do treści WWW, a następnie skopiowałem w nim plik log4j dtd. potem spróbowałem jak poniżej. To działa

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

Ścieżka oznacza tutaj ścieżkę projektu podobną do /projectname

Dileep
źródło
1

Próbowałem z odpowiedzią FrVaBe, ale nie zadziałało dla mnie i zrobiłem małą zmianę w wartości klucza i działa.

„Preferencje -> XML -> Katalog XML”

Localization: C:\Users\me\Desktop\log4j.dtd
Key Type: URI
Key: -//APACHE//DTD LOG4J 1.2//EN
Abel ANEIROS
źródło
1

@Jack Leow używa dobrego podejścia z PUBLIC ID. Jednak, jak podkreśla, wymaga połączenia sieciowego.

Wolę kombinację:

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

Odwołuje się do lokalnego pliku JAR i obsługuje deklarację DOCTYPE bez pełnego adresu URL.

<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
wbdarby
źródło
-1

Zwykle Eclipse szuka log4j.dtdw ścieżce klas i jej tam nie znajduje, stąd błąd. Możemy rozwiązać ten problem, podając adres URL log4j.dtdpliku, jak poniżej.

<!DOCTYPE log4j:configuration SYSTEM 
      "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
Nirbhay Rana
źródło
1
To dokładna kopia tego, co próbowałem w moim pytaniu.
sjngm