Eclipse:在log4j.xml中引用log4j.dtd

时间:2011-02-15 07:25:20

标签: xml eclipse configuration log4j

我现在已经使用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(如果我没有错),所以这不应该是一个问题。

任何人都可以对此有所了解吗?

7 个答案:

答案 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">