Затемнення: Посилання на log4j.dtd в log4j.xml


117

Я використовую log4j для досить довгий час , і я зазвичай використовую це в верхній частині log4j.xml (ймовірно , так само , як і багато інших , і в відповідності з Google це спосіб зробити це):

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

Очевидно, що це працює, проте Eclipse не надає свою контекстну допомогу для написання XML та інших. Крім того, воно завжди показує попередження, що воно не знаходить log4j.dtd. Зараз мені цікаво, як це виправити.

Я спробував кілька речей, і це:

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

Як видно зверху, ми використовуємо Maven. Тому я спробував це, але це не вдається:

<!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 зазвичай знає, як поводитися зі змінними classpath, але чому це не працює? Я знаю, що посилання не працюватиме під час виконання, але не є простим log4j.dtd(якщо я не помиляюся), так що це не повинно бути проблемою.

Хтось може, будь ласка, пролити світло на це?

Відповіді:


176

Я знаю, що на це питання відповіли, але я хотів би запропонувати свою трохи іншу альтернативу:

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

Це схоже на відповідь @ FrVaBe , але, з іншого боку, не потребує додаткової конфігурації Eclipse (тобто, якщо ви ділитесь своїм проектом з іншими або маєте велику команду, це турбується про одну меншу річ).

З іншого боку, я вважаю, що це означає, що вам знадобиться підключення до Інтернету (хоча б в якийсь момент під час розробки, навіть якщо це лише один раз).


такий підхід кращий, ніж прийнятий відповідь, оскільки вам не доведеться мати справу з фізичним розташуванням файлу dtd. Це допомагає при обміні проектом з іншими розробниками.
тузи.

1
Цікаво. Тепер мені потрібно знайти dtd для log4j 2.0 - яка біль - яка конфігурація файлу власності назад!
Мартін

8
колись недавно це припинило роботу. Якщо ви перейдете в браузер на сторінку logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/…, ви побачите, що зараз є помилка xml
Kip

@Kip ви праві, посилання не працює. Отримали оновлене посилання з ким-небудь тут?
мандер

Я перевірив посилання з curl, і він повернув повний DTD. Якщо я спробував подивитися на це в браузері, він повертає помилки. Я б запропонував перевірити його таким інструментом, як curl.
Джон Рік

41

Спробуйте додати log4j.dtd як специфічний для користувача запис URI XML у розділі "Налаштування -> XML -> Каталог XML". Як я знаю, це місце, де eclipse управляє посиланнями на файли визначення / перевірки (наприклад, xsd). Якщо їх можна знайти тут, затемненню не потрібен доступ до Інтернету для доступу до них у рідному (веб-) місці.

Я зробив це так (для тесту) і затемнення не скаржиться:

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

Можливо, також працює $ {M2_REPO} - я цього не перевіряв.

Використовуйте рідну URL-адресу у своєму log4j.xml згодом

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

EDIT

Я б пішов із вищевказаним рішенням, але повертаючись до вашого питання, я думаю, що змінні шляху класу "можуть використовуватися в Java Build Path" . Чому вони повинні працювати всередині визначення DOCTYPE? "Перевірте" (контекстне меню затемнення) файл log4j.xml, і ви отримаєте попередження про те, що шлях неможливо вирішити.

Я сподівався, що classpath:org/apache/log4j/xml/log4j.dtdвдасться виконати трюк, але цей протокол також не підтримує (див. Помилку перевірки). Боюся, це не вийде з коробки.

І, як я зрозумів, SYSTEM "log4j.dtd"позначення не є заповнювачем. Це дійсне посилання на документ, який, як очікується, знайдеться поруч із dtd (у цьому випадку).


Я бачу, що ви говорите, але це здається загальною властивістю. Однак у нас є різні проекти (деякі навіть не Maven-проекти), і вони використовують різні версії log4j. Було б чудово, якби я міг дещо прив’язати конфігурацію до проекту.
sjngm

Якщо ви говорите різні версії log4j - ви маєте на увазі різні версії log4j.dtd? Тоді вам слід визначити запис Каталогу для кожної версії. Я хочу прив'язати конфігурацію до проекту, можливо, найкраще розмістити log4j.dtd поруч з log4j.xml (всередині проекту), а потім <code> СИСТЕМА "log4j.dtd" </code> повинна працювати (я сподівання).
FrVaBe

Вибачте, я мав на увазі іншу версію log4j.jarзагалом. Я припускаю, що "log4j.dtd" - це якесь місце, де воно є таким загальним найменуванням. - Так, копіювання log4j.dtd поруч із XML було б рішенням, але чи справді це звичайний спосіб зробити це?
sjngm

1
І зауважте, що тут мова йде про рішення, яке не спрямоване на головне питання.
sjngm

Вибачте, не помітили, що http-посилання працює - я вважаю, що це найкраще рішення - або просимо вказати посилання на вашу заяву SYSTEM "log4j.dtd" , як це зробити .
FrVaBe

2

Я додав папку DTD у webcontent, а потім скопіював файл log4j dtd. тоді я намагався, як нижче. Це працює

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

Шлях означає тут шлях проекту /projectname


1

Я спробував відповісти FrVaBe, але не працював для мене, і я змінив значення Key і воно працює.

"Налаштування -> XML -> Каталог XML"

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

1

@Jack Leow використовує хороший підхід до ідентифікатора PUBLIC. Однак, як він зазначає, це вимагає підключення до мережі.

Я віддаю перевагу комбінації:

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

Це посилання на локальний JAR і підтримує декларацію DOCTYPE без повної URL-адреси.

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

-1

Зазвичай Eclipse шукає log4j.dtdу classpath, і він його там не знаходить, а значить, і помилка. Ми можемо вирішити цю проблему, надавши URL-адресу для log4j.dtdфайлу, як показано нижче.

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

1
Це точна копія того, що я спробував у своєму питанні.
sjngm
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.