Eclipse: ссылка на 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 обычно знает, как обращаться с переменными пути к классам, но почему это не работает? Я знаю, что ссылка не будет работать во время выполнения, но и простая не работает log4j.dtd(если я не ошибаюсь), так что это не должно быть проблемой.

Кто-нибудь может пролить свет на это?

sjngm
источник

Ответы:

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
Кип
@ Кип, ты прав, ссылка не работает. Есть обновленная ссылка с кем-нибудь здесь?
mannedear
Я проверил ссылку с помощью curl, и она вернула полное DTD. Если я попытался посмотреть его в браузере, он вернул ошибку. Я бы посоветовал проверить это с помощью такого инструмента, как curl.
John Yeary
41

Попробуйте добавить log4j.dtd в качестве записи каталога XML с URI для конкретного пользователя в разделе «Настройки -> XML -> Каталог XML». Насколько я знаю, это место, где eclipse управляет ссылками на файлы определения / проверки (например, xsd). Если их можно найти здесь, eclipse не нужен доступ в Интернет для доступа к ним в их родном (веб-) местоположении.

Я сделал это так (для теста), и eclipse не жалуется:

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

РЕДАКТИРОВАТЬ

Я бы пошел с указанным выше решением, но, возвращаясь к вашему вопросу, я думаю, что переменные пути к классам «можно использовать в пути сборки Java» . Почему они должны работать внутри определения DOCTYPE? «Подтвердите» (контекстное меню eclipse) файл log4j.xml, и вы получите предупреждение о том, что путь не может быть разрешен.

Я надеялся, classpath:org/apache/log4j/xml/log4j.dtdчто у меня получится, но этот протокол также не поддерживается (см. Ошибку проверки). Боюсь, из коробки не получится.

И, как я понял, SYSTEM "log4j.dtd"обозначение не заполнитель. Это действительная ссылка на документ, который, как ожидается, будет находиться рядом с dtd (в данном случае).

FrVaBe
источник
Я понимаю, о чем вы говорите, но, похоже, это общая собственность. Однако у нас есть разные проекты (некоторые даже не Maven-проекты), и они используют разные версии log4j. Было бы здорово, если бы я мог как-то привязать конфигурацию к проекту.
sjngm
Если вы говорите разные версии log4j - вы имеете в виду разные версии log4j.dtd? Затем вам нужно определить запись в каталоге для каждой версии. Если вы хотите привязать конфигурацию к проекту, лучше всего разместить log4j.dtd рядом с log4j.xml (внутри проекта), и тогда <code> SYSTEM "log4j.dtd" </code> должна работать (я надежда).
FrVaBe
Извините, я имел в виду другую версию в log4j.jarцелом. Я предполагаю, что "log4j.dtd" - это своего рода заполнитель, поскольку это такое общее название. - Да, копирование log4j.dtd рядом с XML было бы решением, но действительно ли это обычный способ сделать это?
sjngm
1
И обратите внимание, что мы говорим здесь о решении, которое не затрагивает главный вопрос.
sjngm
Извините, я не заметил, что ссылка http сработала - я думаю, что это лучшее решение - или просьба дать ссылку на ваше утверждение SYSTEM "log4j.dtd" - это способ сделать это .
FrVaBe
2

Я добавил папку DTD в веб-контент, а затем скопировал в нее файл log4j dtd. затем я попробовал, как ниже. Это работает

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

Путь означает здесь путь проекта, например /projectname

Дилип
источник
1

Я попытался ответить FrVaBe, но у меня не получилось, и я немного изменил значение ключа, и он работает.

«Настройки -> XML -> Каталог XML»

Localization: C:\Users\me\Desktop\log4j.dtd
Key Type: URI
Key: -//APACHE//DTD LOG4J 1.2//EN
Абель АНЕЙРОС
источник
1

@Jack Leow использует хороший подход с PUBLIC ID. Тем не менее, как он указывает, для этого требуется подключение к сети.

Я предпочитаю сочетание:

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">
wbdarby
источник
-1

Обычно Eclipse ищет log4j.dtdв пути к классам и не находит его там и, следовательно, ошибки. Мы можем решить эту проблему, указав 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