我现在已经使用log4j很长一段时间了,我通常在log4j.xml的顶部使用它(可能就像许多其他人一样,根据谷歌这是 的方法它):
<!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
(如果我没有错),所以这不应该是一个问题。
任何人都可以对此有所了解吗?
答案 0 :(得分:165)
我知道这个问题已得到解答,但我想提供一些略有不同的选择:
<!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's response,但从好的方面来说,不需要任何进一步的Eclipse配置(即,如果你与其他人共享你的项目,或者拥有一个庞大的团队,那么就少了一点担心)。
不利的一面是,我相信这意味着你需要一个互联网连接(至少在开发过程中的某个时刻,即使它只是一次)。
答案 1 :(得分:39)
尝试在“首选项 - &gt; XML - &gt; XML目录”中将log4j.dtd添加为用户特定的URI 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}也有效 - 我没有检查过这个。
之后使用log4j.xml中的本机URL
<!DOCTYPE log4j:configuration SYSTEM "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
修改强>
我会使用上面的解决方案,但回到你的问题,我认为类路径变量'can be used in a Java Build Path'。他们为什么要在DOCTYPE定义中工作? “验证”(eclipse上下文菜单)log4j.xml文件,您将收到无法解析路径的警告。
我希望classpath:org/apache/log4j/xml/log4j.dtd
可以解决这个问题,但该协议也不支持(请参阅验证错误)。我担心它不会开箱即用。
而且,据我所知,SYSTEM "log4j.dtd"
符号不是占位符。它是对dtd旁边的文档的有效引用(在本例中)。
答案 2 :(得分:2)
我在webcontent中添加了DTD文件夹,然后我复制了log4j dtd文件。然后我试着像吼叫。它的工作
<!DOCTYPE log4j:configuration SYSTEM "<Path>/DTD/log4j.dtd">
路径在此处表示项目路径,如/projectname
答案 3 :(得分:1)
我已尝试使用FrVaBe的答案,但对我不起作用,我对键值进行了一些小改动,它确实有效。
“偏好设置 - &gt; XML - &gt; XML目录”
Localization: C:\Users\me\Desktop\log4j.dtd
Key Type: URI
Key: -//APACHE//DTD LOG4J 1.2//EN
答案 4 :(得分: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,并支持没有完整URL的DOCTYPE声明。
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
答案 5 :(得分:0)
如果您将 log4j.dtd 放在与 log4j.xml 相同的位置,则声明
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
有利于日食(至少日食 2020-06)。
顺便说一句:eclipse错误不会立即消失,而是在log4j.xml文件中进行一些编辑后消失。
答案 6 :(得分:-1)
通常,Eclipse在类路径中查找log4j.dtd
并且它在那里找不到它,因此错误。我们可以通过提供log4j.dtd
文件的网址来解决此问题,如下所示。
<!DOCTYPE log4j:configuration SYSTEM
"http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">