Eclipse: Referencing log4j.dtd in log4j.xml

2020-01-27 10:02发布

I've been using log4j for quite a while now and I usually use this at the top of the log4j.xml (probably just like many others and according to Google this is the way to do it):

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

Obviously this is working, however Eclipse doesn't provide its context-sensitive help for writing the XML and all. Furthermore, it always shows a warning that it doesn't find the log4j.dtd. Now I'm curious how to fix this.

I tried a few things and these work:

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

As you can see from above we're using Maven. Therefore, I tried this, but it fails:

<!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 usually knows how to deal with the classpath variables, but why doesn't this work? I know that the reference won't work during runtime, but neither does a simple log4j.dtd (if I'm not wrong), so that shouldn't be a problem.

Can anyone please shed a light on this?

6条回答
甜甜的少女心
2楼-- · 2020-01-27 10:39

@Jack Leow uses a good approach with the PUBLIC ID. Yet, as he points out, it requires a network connection.

I prefer a combination:

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

This references a local JAR, and supports a DOCTYPE declaration without the full URL.

<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
查看更多
Lonely孤独者°
3楼-- · 2020-01-27 10:43

I added DTD folder in webcontent and then I copied the log4j dtd file in that. then i tried like bellow. Its working

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

Path means here the project path like /projectname

查看更多
家丑人穷心不美
4楼-- · 2020-01-27 10:43

I have tried with FrVaBe's answer but didn't work for me and I did an small change in the Key value and it works.

"Preferences -> XML -> XML Catalog"

Localization: C:\Users\me\Desktop\log4j.dtd
Key Type: URI
Key: -//APACHE//DTD LOG4J 1.2//EN
查看更多
干净又极端
5楼-- · 2020-01-27 10:52

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's response, 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).

The down side though, is that I believe it means you'll need an Internet connection (at least at some point during development, even if it's just one time).

查看更多
做个烂人
6楼-- · 2020-01-27 10:58

Usually, Eclipse looks for log4j.dtd in classpath and it doesn’t find it there and hence the error. We can resolve this issue by providing URL for log4j.dtd file like below.

<!DOCTYPE log4j:configuration SYSTEM 
      "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
查看更多
Summer. ? 凉城
7楼-- · 2020-01-27 11:00

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.

I did it like this (for test) and eclipse does not complain:

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

Maybe also ${M2_REPO} works - I did not check this.

Use the native URL in your log4j.xml afterwards

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

EDIT

I would go with the above solution but to come back to your question, I think class path variables 'can be used in a Java Build Path'. Why should they work inside a DOCTYPE definition? "Validate" (eclipse context menu) the log4j.xml file and you will get a warning that the path can not be resolved.

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.

And, as I understood, the SYSTEM "log4j.dtd" notation is no placeholder. It is a valid reference to a document that is expected to be found next to the dtd (in this case).

查看更多
登录 后发表回答