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?
źródło
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:
Może działa też $ {M2_REPO} - nie sprawdzałem tego.
Następnie użyj natywnego adresu URL w swoim log4j.xml
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).źródło
log4j.jar
cał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?SYSTEM "log4j.dtd"
aby to zrobić .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
Ścieżka oznacza tutaj ścieżkę projektu podobną do
/projectname
źródło
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”
źródło
@Jack Leow używa dobrego podejścia z PUBLIC ID. Jednak, jak podkreśla, wymaga połączenia sieciowego.
Wolę kombinację:
Odwołuje się do lokalnego pliku JAR i obsługuje deklarację DOCTYPE bez pełnego adresu URL.
źródło
Zwykle Eclipse szuka
log4j.dtd
w ścieżce klas i jej tam nie znajduje, stąd błąd. Możemy rozwiązać ten problem, podając adres URLlog4j.dtd
pliku, jak poniżej.źródło