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

Posted

技术标签:

【中文标题】Eclipse:在 log4j.xml 中引用 log4j.dtd【英文标题】:Eclipse: Referencing log4j.dtd in log4j.xml 【发布时间】:2011-06-27 10:01:56 【问题描述】:

我已经使用 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 也不起作用(如果我没记错的话),所以这应该不是问题。

有人能解释一下吗?

【问题讨论】:

【参考方案1】:

我知道这个问题已经得到解答,但我想提供一个稍微不同的选择:

<!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 配置(即,如果您与其他人共享您的项目,或者拥有一个庞大的团队,那就少了一件需要担心的事情)。

不过,不利的一面是,我认为这意味着您将需要 Internet 连接(至少在开发过程中的某个时间点,即使只是一次)。

【讨论】:

这种方法比公认的答案更好,因为您不必处理 dtd 文件的物理位置。这有助于与其他开发人员共享您的项目。 有趣。现在我必须找到 log4j 2.0 的 dtd - 多么痛苦 - 我的属性文件配置回来了! 最近某个时候这已经停止工作。如果你在浏览器中访问logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/…,你会看到现在有一​​个 xml 错误 @Kip 你是对的,链接不起作用。在这里有任何人的更新链接吗? 我用 curl 检查了链接,它返回了一个完整的 DTD。如果我试图在浏览器中查看它,它会返回错误。我建议使用 curl 之类的工具进行检查。【参考方案2】:

尝试将 log4j.dtd 添加为“Preferences -> XML -> XML Catalog”中的用户特定 URI XML 目录条目。据我所知,这是 eclipse 管理对定义/验证文件(如 xsd)的引用的地方。如果可以在此处找到它们,则 Eclipse 无需访问 Internet 即可在其本地(网络)位置访问它们。

我是这样做的(用于测试),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 旁边的文档的有效引用(在这种情况下)。

【讨论】:

我明白你在说什么,但这似乎是一个整体属性。但是,我们有不同的项目(有些甚至不是 Maven 项目),它们使用不同版本的 log4j。如果我能在某种程度上将配置绑定到项目中,那就太好了。 如果你说不同版本的 log4j - 你是指不同版本的 log4j.dtd 吗?比您必须为每个版本定义一个目录条目。我想将配置绑定到项目,最好将 log4j.dtd 放在 log4j.xml 旁边(在项目内部),而不是 SYSTEM "log4j.dtd" 应该工作(我希望)。 抱歉,我指的是整个 log4j.jar 的不同版本。我假设“log4j.dtd”是某种占位符,因为它是一个通用名称。 -- 是的,复制 XML 旁边的 log4j.dtd 是一种解决方案,但这真的是一种常见的方法吗? 请注意,我们在这里讨论的解决方案并不针对主要问题。 抱歉没有注意到 http 参考有效 - 我认为这是最好的解决方案 - 或者请为您的声明提供参考 SYSTEM "log4j.dtd" 是这样做的方法【参考方案3】:

我在 webcontent 中添加了 DTD 文件夹,然后在其中复制了 log4j dtd 文件。然后我尝试了如下。它的工作原理

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

Path 在这里表示项目路径,如/projectname

【讨论】:

【参考方案4】:

我已经尝试过 FrVaBe 的回答,但对我没有用,我对 Key 值做了一个小改动,它可以工作。

“首选项 -> XML -> XML 目录”

Localization: C:\Users\me\Desktop\log4j.dtd
Key Type: URI
Key: -//APACHE//DTD LOG4J 1.2//EN

【讨论】:

【参考方案5】:

@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">

【讨论】:

【参考方案6】:

如果将 log4j.dtd 与 log4j.xml 放在同一位置,则声明

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

对 eclipse 有好处(至少 eclipse 2020-06)。

顺便说一句:eclipse 错误不会立即消失,但在 log4j.xml 文件中进行一些编辑后会消失。

【讨论】:

【参考方案7】:

通常,Eclipse 在类路径中查找log4j.dtd,但在类路径中找不到它,因此会出现错误。我们可以通过提供log4j.dtd 文件的 URL 来解决此问题,如下所示。

<!DOCTYPE log4j:configuration SYSTEM 
      "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">

【讨论】:

这是我在我的问题中尝试过的完全相同的副本。

以上是关于Eclipse:在 log4j.xml 中引用 log4j.dtd的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Eclipse 中配置关键 tc 以使用 log4j 配置而不是其自己的 loggingmanager?

Invalid 'log4jConfigLocation' parameter: class path resource [log4j.xml] cannot be resolved

解决log4j.xml问题http//jakarta.apache.org/log4j/ uri is not registered

在 log4j xml 配置中使用系统环境变量

如何在spring 配置文件中配置log4j.xml

如何在java程序中手动初始化log4j.xml?