Затмение: ссылка на log4j.dtd в log4j.xml
Я уже давно использую 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
(если я не ошибаюсь), так что это не должно быть проблемой.
Кто-нибудь может пролить свет на это?
7 ответов
Я знаю, что на этот вопрос был дан ответ, но я хотел бы предоставить немного другую альтернативу:
<!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 (т. Е. Если вы делитесь своим проектом с другими или у вас большая команда, вам не о чем беспокоиться).
Недостатком является то, что я считаю, что вам понадобится подключение к Интернету (по крайней мере, в какой-то момент в процессе разработки, даже если это только один раз).
Попробуйте добавить 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? "Проверить" (контекстное меню затмения) файл log4j.xml, и вы получите предупреждение о том, что путь не может быть разрешен.
Я надеялся, что classpath:org/apache/log4j/xml/log4j.dtd
будет делать трюк, но этот протокол также не поддерживается (см. ошибка проверки). Я боюсь, что это не будет работать из коробки.
И, как я понял, SYSTEM "log4j.dtd"
нотация не является заполнителем. Это действительная ссылка на документ, который, как ожидается, будет найден рядом с dtd (в данном случае).
Я добавил папку DTD в веб-контент, а затем скопировал в нее файл log4j dtd. затем я попытался как ниже. Работает
<!DOCTYPE log4j:configuration SYSTEM "<Path>/DTD/log4j.dtd">
Путь означает здесь путь проекта, как /projectname
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">
Я попытался с ответом FrVaBe, но у меня не получилось, и я немного изменил значение ключа, и оно работает.
"Настройки -> XML -> Каталог XML"
Localization: C:\Users\me\Desktop\log4j.dtd
Key Type: URI
Key: -//APACHE//DTD LOG4J 1.2//EN
Если вы разместите log4j.dtd в том же месте, что и ваш log4j.xml, объявление
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
подходит для затмения (по крайней мере, затмения 2020-06).
Кстати: ошибка eclipse не исчезает сразу, но исчезает после внесения некоторых изменений в файл log4j.xml.
Обычно 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">