I have solved the problem below. The solution involved changing a couple of
the Tomcat source files due to Digester instances not using the correct
Classloader upon Tomcat startup.
The changes I made are as follows:
1) in Catalina.java:
/**
* Create and configure the Digester we will be using for startup.
*/
protected Digester createStartDigester() {
// Initialize the digester
Digester digester = new Digester();
+ digester.setClassLoader(this.getClass().getClassLoader());
2) in ContextConfig.java:
/**
* Create (if necessary) and return a Digester configured to process the
* web application deployment descriptor (web.xml).
*/
private static Digester createWebDigester() {
URL url = null;
Digester webDigester = new Digester();
+ webDigester.setClassLoader(ContextConfig.class.getClassLoader());
3) Replace the .class files from the above two files into
c:\tomcat\server\lib\Catalina.jar
That's it! My application now starts up correctly and uses its internal
instance of digester doesn't conflict with Tomcat's version.
And in the process, I've learned a lot about Classloaders :)
Matt Kruse
> -----Original Message-----
> From: Kruse, Matt
> Sent: Monday, September 22, 2003 11:08 AM
> To: '[EMAIL PROTECTED]'
> Subject: Using Digester in a Tomcat project causes server not
> to start?
>
>
> I know I'm ignorant in some areas of this problem, so please
> forgive me if I don't explain it well or if I'm missing
> something obvious!
>
> PROBLEM: Tomcat won't startup (via Eclipse plugin) when
> Apache's commons-digester.jar is included as a project lib.
>
> QUESTION: How can I use the Digester in my project with Tomcat?
>
> SEE ALSO (appear to reference the same problem):
> http://www.mail-archive.com/[EMAIL PROTECTED]/msg4
> 5756.html
> http://groups.google.com/groups?selm=c09cb3fc.0307290659.57359
> 042%40posting.google.com
> http://www.mail-archive.com/[EMAIL PROTECTED]/ms
> g02848.html
>
> I've narrowed it down to this being the source of the
> problem. It looks like it has something to do with
> ClassLoaders or something, but I don't know much about that.
> I'm confused.
>
> It's a problem that others have apparently encountered. A
> patch to Catalina may solve the problem, but I haven't seen
> any posts or messages detailing a work-around.
>
> Is there a work-around I can use _NOW_ to make my project
> work in Tomcat?
>
> Thanks!
>
> Matt Kruse
>
> PS:
>
> This is the error I get when including Digester in the
> dependencies and trying to start Tomcat:
>
> 2003-09-22 10:22:29,962 0 [main] DEBUG
> org.apache.commons.digester.Digester - addRuleSet() with no
> namespace URI
> 2003-09-22 10:22:29,978 16 [main] DEBUG
> org.apache.commons.digester.Digester - addRuleSet() with no
> namespace URI
> 2003-09-22 10:22:29,978 16 [main] DEBUG
> org.apache.commons.digester.Digester - addRuleSet() with no
> namespace URI
> 2003-09-22 10:22:29,993 31 [main] DEBUG
> org.apache.commons.digester.Digester - addRuleSet() with no
> namespace URI
> 2003-09-22 10:22:29,993 31 [main] DEBUG
> org.apache.commons.digester.Digester - addRuleSet() with no
> namespace URI
> 2003-09-22 10:22:29,993 31 [main] DEBUG
> org.apache.commons.digester.Digester - addRuleSet() with no
> namespace URI
> 2003-09-22 10:22:29,993 31 [main] DEBUG
> org.apache.commons.digester.Digester - addRuleSet() with no
> namespace URI
> 2003-09-22 10:22:29,993 31 [main] DEBUG
> org.apache.commons.digester.Digester - addRuleSet() with no
> namespace URI
> 2003-09-22 10:22:29,993 31 [main] DEBUG
> org.apache.commons.digester.Digester - addRuleSet() with no
> namespace URI
> 2003-09-22 10:22:30,071 109 [main] DEBUG
> org.apache.commons.digester.Digester.sax -
> setDocumentLocator(org.apache.xerces.parsers.AbstractSAXParser
> [EMAIL PROTECTED])
> 2003-09-22 10:22:30,071 109 [main] DEBUG
> org.apache.commons.digester.Digester.sax - startDocument()
> 2003-09-22 10:22:30,103 141 [main] DEBUG
> org.apache.commons.digester.Digester.sax -
> startPrefixMapping(xml,http://www.w3.org/XML/1998/namespace)
> 2003-09-22 10:22:30,103 141 [main] DEBUG
> org.apache.commons.digester.Digester.sax -
> startPrefixMapping(xmlns,http://www.w3.org/2000/xmlns/)
> 2003-09-22 10:22:30,103 141 [main] DEBUG
> org.apache.commons.digester.Digester.sax - startElement(,,Server)
> 2003-09-22 10:22:30,103 141 [main] DEBUG
> org.apache.commons.digester.Digester - Pushing body text ''
> 2003-09-22 10:22:30,103 141 [main] DEBUG
> org.apache.commons.digester.Digester - New match='Server'
> 2003-09-22 10:22:30,103 141 [main] DEBUG
> org.apache.commons.digester.Digester - Fire begin() for
> ObjectCreateRule[className=org.apache.catalina.core.StandardSe
> rver, attributeName=className]
> 2003-09-22 10:22:30,103 141 [main] DEBUG
> org.apache.commons.digester.Digester -
> [ObjectCreateRule]{Server}New org.apache.catalina.core.StandardServer
> 2003-09-22 10:22:30,103 141 [main] ERROR
> org.apache.commons.digester.Digester - Begin event threw exception
> java.lang.ClassNotFoundException:
> org.apache.catalina.core.StandardServer
> at java.net.URLClassLoader$1.run(URLClassLoader.java:198)
> at java.security.AccessController.doPrivileged(Native Method)
> at java.net.URLClassLoader.findClass(URLClassLoader.java:186)
> at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
> at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:265)
> at java.lang.ClassLoader.loadClass(ClassLoader.java:262)
> at
> org.apache.commons.digester.ObjectCreateRule.begin(ObjectCreat
> eRule.java:252)
> at org.apache.commons.digester.Rule.begin(Rule.java:200)
> at
> org.apache.commons.digester.Digester.startElement(Digester.java:1268)
> at
> org.apache.xerces.parsers.AbstractSAXParser.startElement(Unkno
> wn Source)
> at
> org.apache.xerces.impl.dtd.XMLDTDValidator.startElement(Unknow
> n Source)
> at
> org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanStar
> tElement(Unknown Source)
> at
> org.apache.xerces.impl.XMLDocumentScannerImpl$ContentDispatche
> r.scanRootElementHook(Unknown Source)
> at
> org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$Fragment
> ContentDispatcher.dispatch(Unknown Source)
> at
> org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocu
> ment(Unknown Source)
> at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
> at org.apache.xerces.parsers.DTDConfiguration.parse(Unknown Source)
> at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
> at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
> at org.apache.commons.digester.Digester.parse(Digester.java:1543)
> at org.apache.catalina.startup.Catalina.start(Catalina.java:449)
> at org.apache.catalina.startup.Catalina.execute(Catalina.java:400)
> at org.apache.catalina.startup.Catalina.process(Catalina.java:180)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccess
> orImpl.java:39)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMeth
> odAccessorImpl.java:25)
> at java.lang.reflect.Method.invoke(Method.java:324)
> at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:203)
> Catalina.start: java.lang.ClassNotFoundException:
> org.apache.catalina.core.StandardServer
> java.lang.ClassNotFoundException:
> org.apache.catalina.core.StandardServer
> at
> org.apache.commons.digester.Digester.createSAXException(Digest
> er.java:2383)
> at
> org.apache.commons.digester.Digester.createSAXException(Digest
> er.java:2409)
> at
> org.apache.commons.digester.Digester.startElement(Digester.java:1271)
> at
> org.apache.xerces.parsers.AbstractSAXParser.startElement(Unkno
> wn Source)
> at
> org.apache.xerces.impl.dtd.XMLDTDValidator.startElement(Unknow
> n Source)
> at
> org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanStar
> tElement(Unknown Source)
> at
> org.apache.xerces.impl.XMLDocumentScannerImpl$ContentDispatche
> r.scanRootElementHook(Unknown Source)
> at
> org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$Fragment
> ContentDispatcher.dispatch(Unknown Source)
> at
> org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocu
> ment(Unknown Source)
> at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
> at org.apache.xerces.parsers.DTDConfiguration.parse(Unknown Source)
> at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
> at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
> at org.apache.commons.digester.Digester.parse(Digester.java:1543)
> at org.apache.catalina.startup.Catalina.start(Catalina.java:449)
> at org.apache.catalina.startup.Catalina.execute(Catalina.java:400)
> at org.apache.catalina.startup.Catalina.process(Catalina.java:180)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccess
> orImpl.java:39)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMeth
> odAccessorImpl.java:25)
> at java.lang.reflect.Method.invoke(Method.java:324)
> at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:203)
>
>