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

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

有人能解释一下吗?

95434 次浏览

Try to add the log4j.dtd as a User Specific URI XML Catalog Entry in "Preferences -> XML -> XML Catalog". As I know this is the place where eclipse manages the references to definition/validation files (like xsd). If they can be found here eclipse needs no internet access to access them on their native (web) location.

我是这样做的(为了测试) ,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 定义中工作?在 log4j.xml 文件的“验证”(Eclipse 上下文菜单)中,您将收到路径无法解析的警告。

I hoped classpath:org/apache/log4j/xml/log4j.dtd would do the trick but that protocol is also not support (see validation error). I am afraid it will not work out of the box.

据我所知,SYSTEM "log4j.dtd"符号不是占位符。它是对文档的有效引用,该文档应该位于 dtd 旁边(在本例中)。

我在 webcontent 中添加了 DTD 文件夹,然后在其中复制了 log4jdtd 文件。然后我像吼叫一样试着。起作用了

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

Path 在这里表示像 /projectname这样的项目路径

I know this question has been answered, but I'd like to provide my slightly different alternative:

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

It is similar to @ FrVaBe 的回应, but on the plus side, does not require any further Eclipse configuration (i.e., if you're sharing your project with others, or have a large team, it's one less thing to worry about).

不过,不利的一面是,我相信这意味着你需要一个互联网连接(至少在开发过程中的某个时刻,即使只有一次)。

我已经尝试与 FrVaBe 的答案,但不适合我,我做了一个小的变化,在 钥匙的价值,它的工作。

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

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

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

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

If you place the log4j.dtd at the same location as your log4j.xml, the declaration

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

日食(至少是2020-06年的日食)。

BTW: The eclipse error does not disappear immediately, but it disappears after doing some edits within the log4j.xml file.