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


117

我已经使用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通常知道如何处理类路径变量,但是为什么这不起作用?我知道该引用在运行时不会起作用,但是简单的引用log4j.dtd(如果我没记错的话)也不会起作用,因此这应该不是问题。

谁能说明一下吗?

Answers:


176

我知道这个问题已经回答,但是我想提供一些略有不同的选择:

<!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配置(即,如果您要与其他人共享您的项目,或者拥有一个庞大的团队,则不必担心。)

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


这种方法比公认的答案更好,因为您不必处理dtd文件的物理位置。与其他开发人员共享项目时,这会有所帮助。
王牌。

1
有趣。现在,我必须找到log4j 2.0的dtd-什么痛苦-什么是我的属性文件配置!
马丁

8
最近某个时候,它已停止工作。如果您在浏览器中访问logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/…,您会发现现在存在xml错误
Kip

@Kip,您是对的,链接无效。与这里的任何人有任何更新的链接吗?
mannedear '18

我用curl检查了链接,它返回了完整的DTD。如果尝试在浏览器中查看它,它将返回错误。我建议用卷曲之类的工具检查它。
John Yeary

41

尝试在“首选项-> XML-> XML目录”中将log4j.dtd添加为用户特定的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">

编辑

我将采用上述解决方案,但回到您的问题,我认为类路径变量“可以在Java构建路径中使用”。为什么要在DOCTYPE定义中使用它们?“验证”(Eclipse上下文菜单)log4j.xml文件,您将收到一条警告,提示无法解析路径。

我希望classpath:org/apache/log4j/xml/log4j.dtd可以解决这个问题,但是该协议也不支持(请参见验证错误)。恐怕开箱即用。

而且,据我了解,该SYSTEM "log4j.dtd"符号不是占位符。这是对有望在dtd旁边找到的文档的有效引用(在这种情况下)。


我明白您在说什么,但这似乎是一个整体。但是,我们有不同的项目(甚至没有Maven项目),并且它们使用不同版本的log4j。如果可以将配置绑定到项目,那将是很好的。
sjngm 2011年

如果您说不同版本的log4j-您是说不同版本的log4j.dtd吗?比您必须为每个版本定义一个目录条目。我想将配置绑定到项目,最好将log4j.dtd放置在log4j.xml旁边(在项目内部),然后<code> SYSTEM“ log4j.dtd” </ code>应该起作用(我希望)。
FrVaBe

抱歉,我指的log4j.jar是整个版本的不同版本。我认为“ log4j.dtd”是某种占位符,因为它是这样的通用名称。-是的,将log4j.dtd复制到XML旁边是一种解决方案,但这真的是一种常见的方法吗?
sjngm 2011年

1
并且请注意,我们在此处讨论的解决方案并不针对主要问题。
sjngm 2011年

对不起,没有注意到http参考有效-我认为这是最好的解决方案-或为您的声明提供参考SYSTEM "log4j.dtd" 是解决问题的方法
FrVaBe

2

我在Webcontent中添加了DTD文件夹,然后在其中复制了log4j dtd文件。然后我像波纹管一样尝试。它的工作

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

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


1

我已经尝试过FrVaBe的答案,但对我没有用,并且我对Key进行了少量更改值并且它起作用了。

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

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

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

-1

通常,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">

1
那是我在问题中尝试过的内容的精确副本。
sjngm 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.