Затмение: ссылка на log4j.dtd в log4j.xml - PullRequest
112 голосов
/ 15 февраля 2011

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

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

Ответы [ 6 ]

169 голосов
/ 01 июня 2012

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

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

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

39 голосов
/ 15 февраля 2011

Попробуйте добавить 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 Build Path' .Почему они должны работать внутри определения DOCTYPE?«Проверьте» (контекстное меню затмения) файл log4j.xml, и вы получите предупреждение о том, что путь не может быть разрешен.

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

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

2 голосов
/ 29 августа 2011

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

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

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

1 голос
/ 24 сентября 2014

@ Джек Леу использует хороший подход с ПУБЛИЧНЫМ ИД.Тем не менее, как он указывает, для этого требуется подключение к сети.

Я предпочитаю комбинацию:

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.

1 голос
/ 28 июня 2012

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

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

Localization: C:\Users\me\Desktop\log4j.dtd
Key Type: URI
Key: -//APACHE//DTD LOG4J 1.2//EN
0 голосов
/ 21 сентября 2015

Обычно 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">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...