DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT <http://nagoya.apache.org/bugzilla/show_bug.cgi?id=10909>. ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND INSERTED IN THE BUG DATABASE.
http://nagoya.apache.org/bugzilla/show_bug.cgi?id=10909 Problem calling anonymous classes in servlet destroy() method Summary: Problem calling anonymous classes in servlet destroy() method Product: Tomcat 4 Version: 4.0.4 Final Platform: PC OS/Version: Windows XP Status: NEW Severity: Normal Priority: Other Component: Catalina AssignedTo: [EMAIL PROTECTED] ReportedBy: [EMAIL PROTECTED] Symptoms: Servlet destroy() method fails with a java.lang.NoClassDefFoundError when an anonymous local class is used. A similar anonymous local class can be used e.g. in the servlet doGet() method without error. Example code producing the error: package tests; import javax.servlet.*; import javax.servlet.http.*; public class TestServlet extends HttpServlet { protected String[] strings = { "delta", "charlie", "echo", "foxtrot", "alpha", "bravo" }; public void init() { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException { java.util.ArrayList myList = new java.util.ArrayList(); for(int i = 0; i < strings.length; ++i) { myList.add(strings[i]); } response.setContentType("text/plain"); java.io.PrintWriter out = response.getWriter(); out.println(new java.util.Date()); out.println("Unsorted list:"); for(java.util.Iterator it = myList.iterator(); it.hasNext(); ) { out.println(it.next()); } out.println("Reverse sorted using comparator inner class:"); java.util.Collections.sort(myList, new java.util.Comparator() { public int compare(java.lang.Object o1, java.lang.Object o2) { String s1 = (String) o1; String s2 = (String) o2; return s2.compareTo(s1); } }); for(java.util.Iterator it = myList.iterator(); it.hasNext(); ) { out.println(it.next()); } out.close(); } public void destroy() { java.util.ArrayList myList = new java.util.ArrayList(); for(int i = 0; i < strings.length; ++i) { myList.add(strings[i]); } try { System.out.println("Reverse sorted list:"); for(java.util.Iterator it = myList.iterator(); it.hasNext(); ) { System.out.println(it.next()); } System.out.println("Sorted using comparator inner class:"); java.util.Collections.sort(myList, new java.util.Comparator() { public int compare(java.lang.Object o1, java.lang.Object o2) { String s1 = (String) o1; String s2 = (String) o2; return s1.compareTo(s2); } }); for(java.util.Iterator it = myList.iterator(); it.hasNext(); ) { System.out.println(it.next()); } } catch(Throwable th) { log("caught in destroy(): ", th); } super.destroy(); } } The code in the doGet() method works fine (i.e. the list is sorted in reverse alphabetical order as expected). However, when Tomcat is stopped in the normal way, the essentially identical code in the destroy() method throws an exception like: 2002-07-17 18:12:14 TestServlet: caught in destroy(): java.lang.NoClassDefFoundError: tests/TestServlet$2 at tests.TestServlet.destroy(TestServlet.java:58) at org.apache.catalina.core.StandardWrapper.unload(StandardWrapper.java:1090) at org.apache.catalina.core.StandardWrapper.stop(StandardWrapper.java:1298) at org.apache.catalina.core.ContainerBase.removeChild(ContainerBase.java:984) at org.apache.catalina.startup.ContextConfig.stop(ContextConfig.java:877) at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:226) at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:155) at org.apache.catalina.core.ContainerBase.stop(ContainerBase.java:1151) at org.apache.catalina.core.StandardContext.stop(StandardContext.java:3495) at org.apache.catalina.core.ContainerBase.removeChild(ContainerBase.java:984) at org.apache.catalina.core.StandardHost.remove(StandardHost.java:815) at org.apache.catalina.startup.HostConfig.undeployApps(HostConfig.java:422) at org.apache.catalina.startup.HostConfig.stop(HostConfig.java:402) at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:234) at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:155) at org.apache.catalina.core.ContainerBase.stop(ContainerBase.java:1151) at org.apache.catalina.core.ContainerBase.stop(ContainerBase.java:1163) at org.apache.catalina.core.StandardService.stop(StandardService.java:435) at org.apache.catalina.core.StandardServer.stop(StandardServer.java:535) at org.apache.catalina.startup.Catalina.start(Catalina.java:799) at org.apache.catalina.startup.Catalina.execute(Catalina.java:681) at org.apache.catalina.startup.Catalina.process(Catalina.java:179) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:324) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:243) The TestServlet$2.class (and the TestServlet$1.class) anonymous class implementation files are both present in the WEB-INF/classes/tests subdirectory. The problem seems to only occur in the destroy() method. -- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>