--- java/org/apache/tomcat/util/digester/ObjectCreateRule.java (revision 1516628) +++ java/org/apache/tomcat/util/digester/ObjectCreateRule.java (working copy) @@ -19,6 +19,10 @@ package org.apache.tomcat.util.digester; +import java.net.URL; +import java.net.URLClassLoader; + +import org.apache.juli.logging.Log; import org.xml.sax.Attributes; @@ -141,11 +145,50 @@ } // Instantiate the new object and push it on the context stack - Class clazz = digester.getClassLoader().loadClass(realClassName); - Object instance = clazz.newInstance(); - digester.push(instance); + ClassLoader classLoader = digester.getClassLoader(); + try { + Class clazz = classLoader.loadClass(realClassName); + Object instance = clazz.newInstance(); + digester.push(instance); + } catch (ClassNotFoundException t) { + Log log = digester.log; + log.warn(t.getMessage(), t); + showClassPath(classLoader, 0, log); + throw t; + } } + public static void showClassPath(ClassLoader classLoader, + int antiRecursion, Log log) { + StringBuffer extraInfo = new StringBuffer("ClassLoader " + classLoader + + "\n"); + if (classLoader instanceof URLClassLoader) { + URLClassLoader ucl = (URLClassLoader) classLoader; + URL[] urls = ucl.getURLs(); + if (null == urls || 0 == urls.length) { + extraInfo.append("null == urls"); + } else { + int i = 0; + for (i = 0; i < urls.length; i++) { + URL url = urls[i]; + extraInfo.append(url.toString()).append(",\n"); + } + log.warn(extraInfo); + } + ClassLoader parent = ucl.getParent(); + if (null != parent) { + if (!parent.equals(ucl)) { + if (7 < antiRecursion) { + log.error("too many recursions"); + } else { + antiRecursion++; + log.warn("\nParent " + antiRecursion + ":"); + showClassPath(parent, antiRecursion, log); + } + } + } + } + } /** * Process the end of this element. --- java/org/apache/catalina/loader/WebappClassLoader.java (revision 1516628) +++ java/org/apache/catalina/loader/WebappClassLoader.java (working copy) @@ -77,6 +77,7 @@ import org.apache.naming.resources.ResourceAttributes; import org.apache.tomcat.util.ExceptionUtils; import org.apache.tomcat.util.IntrospectionUtils; +import org.apache.tomcat.util.digester.ObjectCreateRule; import org.apache.tomcat.util.res.StringManager; /** @@ -1711,7 +1712,9 @@ } } - throw new ClassNotFoundException(name); + ClassNotFoundException classNotFoundException = new ClassNotFoundException(name); + ObjectCreateRule.showClassPath(this, 0, log); + throw classNotFoundException; }