Затмение: ссылка на log4j.dtd в log4j.xml

104

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

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

Теги:
log4j
configuration

6 ответов

157
Лучший ответ

Я знаю, что на этот вопрос был дан ответ, но я хотел бы предложить свою немного другую альтернативу:

<!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 (т.е. если вы делитесь своим проектом с другими, или иметь большую команду, это еще одна вещь, о которой нужно беспокоиться).

Тем не менее, я считаю, что это означает, что вам понадобится подключение к Интернету (по крайней мере, в какой-то момент во время разработки, даже если это будет только один раз).

  • 0
    этот подход лучше, чем принятый ответ, так как вам не нужно иметь дело с физическим местоположением файла dtd. Это помогает, когда вы делитесь своим проектом с другими разработчиками.
  • 1
    Интересно. Теперь я должен найти dtd для log4j 2.0 - какая боль - какая конфигурация моего файла свойств вернулась!
Показать ещё 3 комментария
36

Попытайтесь добавить log4j.dtd в качестве отдельной записи каталога XML URI в "Предпочтения → XML → Каталог XML". Как я знаю, это место, где eclipse управляет ссылками на файлы определения/проверки (например, xsd). Если их можно найти здесь, 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 (в этом случае).

  • 0
    Я понимаю, что вы говорите, но это, кажется, общая собственность. Однако у нас есть разные проекты (некоторые даже не Maven-проекты), и они используют разные версии log4j. Было бы здорово, если бы я мог связать конфигурацию с проектом.
  • 0
    Если вы говорите разные версии log4j - вы имеете в виду разные версии log4j.dtd? Чем вы должны определить запись каталога для каждой версии. Если вы хотите связать конфигурацию с проектом, лучше всего поместить log4j.dtd рядом с log4j.xml (внутри проекта), а затем <code> SYSTEM "log4j.dtd" </ code> работать (я надеюсь).
Показать ещё 7 комментариев
2

Я добавил папку DTD в webcontent, а затем скопировал файл log4j dtd. то я пробовал, как рев. Его работа

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

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

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

Я попытался с ответом FrVaBe, но не работал у меня, и я сделал небольшое изменение в значении Key, и он работает.

"Настройки → XML → Каталог XML"

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

Обычно 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">
  • 0
    Это точная копия того, что я попробовал в своем вопросе.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню