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?
@Jack Leow uses a good approach with the PUBLIC ID. Yet, as he points out, it requires a network connection.
I prefer a combination:
This references a local JAR, and supports a DOCTYPE declaration without the full URL.
I added DTD folder in webcontent and then I copied the log4j dtd file in that. then i tried like bellow. Its working
Path means here the project path like
/projectname
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"
I know this question has been answered, but I'd like to provide my slightly different alternative:
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).
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 forlog4j.dtd
file like below.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:
Maybe also ${M2_REPO} works - I did not check this.
Use the native URL in your log4j.xml afterwards
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).