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

<p>я уже давно использую log4j и обычно использую его в верхней части log4j.xml (вероятно, как и многие другие, и, по мнению google, это <em>способ</em> способ сделать это):</p><pre><code><!doctype log4j:configuration system "log4j.dtd"> </code></pre><p>очевидно, что это работает, однако eclipse не предоставляет контекстно-зависимую справку для написания xml и все такое. кроме того, он всегда показывает предупреждение о том, что не находит <code>log4j.dtd</code>. теперь мне интересно, как это исправить.</p><p>я попробовал несколько вещей, и эти работы:</p><pre><code><!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"> </code></pre><p>как вы можете видеть сверху, мы используем maven. поэтому я попробовал это, но это не удалось:</p><pre><code><!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 (если я не ошибаюсь), так что это не должно быть проблемой.кто-нибудь может пролить свет на это?

я знаю, что на этот вопрос был дан ответ, но я хотел бы предоставить немного другую альтернативу:<!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"> это похоже на <a href="https://stackoverflow.com/a/5001223/31506">ответ @ frvabe , но, с другой стороны, не требует дополнительной настройки eclipse (т. е. если вы делитесь своим проектом с другими или у вас большая команда, это на единицу меньше). о чем беспокоиться).недостатком является то, что я считаю, что вам понадобится подключение к интернету (по крайней мере, в какой-то момент в процессе разработки, даже если это всего лишь один раз).

попробуйте добавить log4j.dtd в качестве пользовательской записи xml-каталога uri в "предпочтения -> xml -> каталог xml". как я знаю, именно здесь eclipse управляет ссылками на файлы определений/проверок (например, xsd). если их можно найти здесь, eclipse не требуется доступ в интернет для доступа к ним в их родном (веб) месте.я сделал это так (для теста) и eclipse не жалуется:entry element: uri location: c:usersmedesktoplog4j.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} - я не проверял это.</p><p>используйте родной url в вашем log4j.xml впоследствии</p><pre><code><!doctype log4j:configuration system "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd"> </code></pre><p><strong>редактировать</strong></p><p>я хотел бы пойти с вышеупомянутым решением, но чтобы вернуться к вашему вопросу, я думаю, что переменные пути класса <a href="http://help.eclipse.org/helios/topic/org.eclipse.jdt.doc.user/reference/preferences/java/buildpath/ref-preferences-classpath-variables.htm">'может использоваться в java build path'</a> . почему они должны работать внутри определения doctype? "проверить" (контекстное меню eclipse) файл log4j.xml, и вы получите предупреждение о том, что путь не может быть разрешен.</p><p>я надеялся, что <code>classpath:org/apache/log4j/xml/log4j.dtd</code> справится, но этот протокол также не поддерживается (см. ошибка проверки). я боюсь, что это не будет работать из коробки.</p><p>и, как я понял, нотация <code>system "log4j.dtd"</code> не является заполнителем. это действительная ссылка на документ, который, как ожидается, будет найден рядом с dtd (в данном случае).</p>

<p>я добавил папку dtd в веб-контент, а затем скопировал в нее файл log4j dtd. затем я попытался как ниже. работает</p><pre><code><!doctype log4j:configuration system "<path>/dtd/log4j.dtd"> </code></pre><p>путь означает здесь путь к проекту, такой как <code>/projectname</code></p>

<p>я попытался с ответом frvabe, но у меня не получилось, и я немного изменил значение <strong>key</strong>, и это работает.</p><p>"настройки -> xml -> каталог xml"</p><pre><code>localization: c:\users\me\desktop\log4j.dtd key type: uri key: -//apache//dtd log4j 1.2//en </code></pre>

<p> <a href="https://stackoverflow.com/users/31506/jack-leow">@ джек лиу</a> использует хороший подход с публичным ид. тем не менее, как он указывает, для этого требуется подключение к сети.</p><p>я предпочитаю комбинацию:</p><pre><code>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 </code></pre><p>это ссылается на локальный jar и поддерживает объявление doctype без полного url.</p><pre><code><!doctype log4j:configuration public "-//apache//dtd log4j 1.2//en" "log4j.dtd"> </code></pre>