Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.

Bug 337328

Summary: Class loading error when configuring logback status servlet
Product: [RT] Virgo Reporter: Glyn Normington <glyn.normington>
Component: runtimeAssignee: Project Inbox <virgo-inbox>
Status: CLOSED WORKSFORME QA Contact:
Severity: normal    
Priority: P3    
Version: 3.0.0.M01   
Target Milestone: ---   
Hardware: PC   
OS: Mac OS X - Carbon (unsup.)   
Whiteboard:
Attachments:
Description Flags
Sample to reproduce the problem none

Description Glyn Normington CLA 2011-02-16 10:57:28 EST
Created attachment 189108 [details]
Sample to reproduce the problem

In http://logback.qos.ch/manual/configuration.html under "Viewing Status Messages", it appears you can configure a servlet for viewing logback status. I thought I would try this on Virgo. The attached web app (which requires  ch.qos.logback.classic to be added to the user region packageImports property) gives the following stack trace when invoked at "http://localhost:8080/samplewab/lbClassicStatus":

javax.servlet.ServletException: Error allocating a servlet instance
	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	org.eclipse.virgo.web.tomcat.ApplicationNameTrackingValve.invoke(ApplicationNameTrackingValve.java:29)
	org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:555)
	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
	org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	java.lang.Thread.run(Thread.java:680)
root cause

java.lang.NoClassDefFoundError: ch.qos.logback.classic.ViewStatusMessagesServlet not found from bundle [Sample WAB (SampleWAB)]
	org.springframework.osgi.util.BundleDelegatingClassLoader.findClass(BundleDelegatingClassLoader.java:112)
	org.springframework.osgi.util.BundleDelegatingClassLoader.loadClass(BundleDelegatingClassLoader.java:156)
	java.lang.ClassLoader.loadClass(ClassLoader.java:248)
	org.eclipse.gemini.web.tomcat.internal.loading.ChainedClassLoader.doLoadClass(ChainedClassLoader.java:167)
	org.eclipse.gemini.web.tomcat.internal.loading.ChainedClassLoader.loadClass(ChainedClassLoader.java:157)
	org.eclipse.gemini.web.tomcat.internal.loading.BundleWebappClassLoader.loadClass(BundleWebappClassLoader.java:272)
	java.lang.ClassLoader.loadClass(ClassLoader.java:248)
	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	org.eclipse.virgo.web.tomcat.ApplicationNameTrackingValve.invoke(ApplicationNameTrackingValve.java:29)
	org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:555)
	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
	org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	java.lang.Thread.run(Thread.java:680)
root cause

org.eclipse.virgo.kernel.osgi.framework.ExtendedNoClassDefFoundError: javax/servlet/http/HttpServlet in KernelBundleClassLoader: [bundle=SampleWAB_1.0.0]
	org.eclipse.virgo.kernel.userregion.internal.equinox.KernelBundleClassLoader.loadClass(KernelBundleClassLoader.java:141)
	java.lang.ClassLoader.loadClass(ClassLoader.java:248)
	org.eclipse.osgi.internal.loader.BundleLoader.loadClass(BundleLoader.java:345)
	org.eclipse.osgi.framework.internal.core.BundleHost.loadClass(BundleHost.java:230)
	org.eclipse.osgi.framework.internal.core.AbstractBundle.loadClass(AbstractBundle.java:1208)
	org.springframework.osgi.util.BundleDelegatingClassLoader.findClass(BundleDelegatingClassLoader.java:99)
	org.springframework.osgi.util.BundleDelegatingClassLoader.loadClass(BundleDelegatingClassLoader.java:156)
	java.lang.ClassLoader.loadClass(ClassLoader.java:248)
	org.eclipse.gemini.web.tomcat.internal.loading.ChainedClassLoader.doLoadClass(ChainedClassLoader.java:167)
	org.eclipse.gemini.web.tomcat.internal.loading.ChainedClassLoader.loadClass(ChainedClassLoader.java:157)
	org.eclipse.gemini.web.tomcat.internal.loading.BundleWebappClassLoader.loadClass(BundleWebappClassLoader.java:272)
	java.lang.ClassLoader.loadClass(ClassLoader.java:248)
	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	org.eclipse.virgo.web.tomcat.ApplicationNameTrackingValve.invoke(ApplicationNameTrackingValve.java:29)
	org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:555)
	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
	org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	java.lang.Thread.run(Thread.java:680)
root cause

java.lang.NoClassDefFoundError: javax/servlet/http/HttpServlet
	java.lang.ClassLoader.defineClass1(Native Method)
	java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
	java.lang.ClassLoader.defineClass(ClassLoader.java:616)
	org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.defineClass(DefaultClassLoader.java:188)
	org.eclipse.osgi.baseadaptor.loader.ClasspathManager.defineClass(ClasspathManager.java:589)
	org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findClassImpl(ClasspathManager.java:557)
	org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClassImpl(ClasspathManager.java:488)
	org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass_LockClassLoader(ClasspathManager.java:476)
	org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(ClasspathManager.java:456)
	org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(DefaultClassLoader.java:216)
	org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:400)
	org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:476)
	org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:429)
	org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:417)
	org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107)
	java.lang.ClassLoader.loadClass(ClassLoader.java:248)
	java.lang.ClassLoader.defineClass1(Native Method)
	java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
	java.lang.ClassLoader.defineClass(ClassLoader.java:616)
	org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.defineClass(DefaultClassLoader.java:188)
	org.eclipse.osgi.baseadaptor.loader.ClasspathManager.defineClass(ClasspathManager.java:589)
	org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findClassImpl(ClasspathManager.java:557)
	org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClassImpl(ClasspathManager.java:488)
	org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass_LockClassLoader(ClasspathManager.java:476)
	org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(ClasspathManager.java:456)
	org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(DefaultClassLoader.java:216)
	org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:400)
	org.eclipse.osgi.internal.loader.SingleSourcePackage.loadClass(SingleSourcePackage.java:35)
	org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:464)
	org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:429)
	org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:417)
	org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107)
	org.eclipse.virgo.kernel.userregion.internal.equinox.KernelBundleClassLoader.loadClass(KernelBundleClassLoader.java:135)
	java.lang.ClassLoader.loadClass(ClassLoader.java:248)
	org.eclipse.osgi.internal.loader.BundleLoader.loadClass(BundleLoader.java:345)
	org.eclipse.osgi.framework.internal.core.BundleHost.loadClass(BundleHost.java:230)
	org.eclipse.osgi.framework.internal.core.AbstractBundle.loadClass(AbstractBundle.java:1208)
	org.springframework.osgi.util.BundleDelegatingClassLoader.findClass(BundleDelegatingClassLoader.java:99)
	org.springframework.osgi.util.BundleDelegatingClassLoader.loadClass(BundleDelegatingClassLoader.java:156)
	java.lang.ClassLoader.loadClass(ClassLoader.java:248)
	org.eclipse.gemini.web.tomcat.internal.loading.ChainedClassLoader.doLoadClass(ChainedClassLoader.java:167)
	org.eclipse.gemini.web.tomcat.internal.loading.ChainedClassLoader.loadClass(ChainedClassLoader.java:157)
	org.eclipse.gemini.web.tomcat.internal.loading.BundleWebappClassLoader.loadClass(BundleWebappClassLoader.java:272)
	java.lang.ClassLoader.loadClass(ClassLoader.java:248)
	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	org.eclipse.virgo.web.tomcat.ApplicationNameTrackingValve.invoke(ApplicationNameTrackingValve.java:29)
	org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:555)
	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
	org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	java.lang.Thread.run(Thread.java:680)
root cause

java.lang.ClassNotFoundException: javax.servlet.http.HttpServlet
	org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:513)
	org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:429)
	org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:417)
	org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107)
	java.lang.ClassLoader.loadClass(ClassLoader.java:248)
	java.lang.ClassLoader.defineClass1(Native Method)
	java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
	java.lang.ClassLoader.defineClass(ClassLoader.java:616)
	org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.defineClass(DefaultClassLoader.java:188)
	org.eclipse.osgi.baseadaptor.loader.ClasspathManager.defineClass(ClasspathManager.java:589)
	org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findClassImpl(ClasspathManager.java:557)
	org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClassImpl(ClasspathManager.java:488)
	org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass_LockClassLoader(ClasspathManager.java:476)
	org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(ClasspathManager.java:456)
	org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(DefaultClassLoader.java:216)
	org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:400)
	org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:476)
	org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:429)
	org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:417)
	org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107)
	java.lang.ClassLoader.loadClass(ClassLoader.java:248)
	java.lang.ClassLoader.defineClass1(Native Method)
	java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
	java.lang.ClassLoader.defineClass(ClassLoader.java:616)
	org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.defineClass(DefaultClassLoader.java:188)
	org.eclipse.osgi.baseadaptor.loader.ClasspathManager.defineClass(ClasspathManager.java:589)
	org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findClassImpl(ClasspathManager.java:557)
	org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClassImpl(ClasspathManager.java:488)
	org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass_LockClassLoader(ClasspathManager.java:476)
	org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(ClasspathManager.java:456)
	org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(DefaultClassLoader.java:216)
	org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:400)
	org.eclipse.osgi.internal.loader.SingleSourcePackage.loadClass(SingleSourcePackage.java:35)
	org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:464)
	org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:429)
	org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:417)
	org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107)
	org.eclipse.virgo.kernel.userregion.internal.equinox.KernelBundleClassLoader.loadClass(KernelBundleClassLoader.java:135)
	java.lang.ClassLoader.loadClass(ClassLoader.java:248)
	org.eclipse.osgi.internal.loader.BundleLoader.loadClass(BundleLoader.java:345)
	org.eclipse.osgi.framework.internal.core.BundleHost.loadClass(BundleHost.java:230)
	org.eclipse.osgi.framework.internal.core.AbstractBundle.loadClass(AbstractBundle.java:1208)
	org.springframework.osgi.util.BundleDelegatingClassLoader.findClass(BundleDelegatingClassLoader.java:99)
	org.springframework.osgi.util.BundleDelegatingClassLoader.loadClass(BundleDelegatingClassLoader.java:156)
	java.lang.ClassLoader.loadClass(ClassLoader.java:248)
	org.eclipse.gemini.web.tomcat.internal.loading.ChainedClassLoader.doLoadClass(ChainedClassLoader.java:167)
	org.eclipse.gemini.web.tomcat.internal.loading.ChainedClassLoader.loadClass(ChainedClassLoader.java:157)
	org.eclipse.gemini.web.tomcat.internal.loading.BundleWebappClassLoader.loadClass(BundleWebappClassLoader.java:272)
	java.lang.ClassLoader.loadClass(ClassLoader.java:248)
	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	org.eclipse.virgo.web.tomcat.ApplicationNameTrackingValve.invoke(ApplicationNameTrackingValve.java:29)
	org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:555)
	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
	org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	java.lang.Thread.run(Thread.java:680)

I used the Equinox console to check whether the WAB can actually load this class and it can:

osgi> clload javax.servlet.http.HttpServlet

Successfully loaded [javax.servlet.http.HttpServlet] from:

  ...
  clload javax.servlet.http.HttpServlet

Successfully loaded [javax.servlet.http.HttpServlet] from:

  ...
  105	SampleWAB
  		[exported by 56 com.springsource.javax.servlet]
  ...
  56	com.springsource.javax.servlet
  ...

I didn't have time to debug this in this sprint, so I am logging a bug for investigation in the fulness of time.
Comment 1 Glyn Normington CLA 2011-02-17 05:29:21 EST
Thanks to Violeta for spotting the basic problem - that the medic core bundle in the kernel has optional imports for javax.servlet.* packages.

So the solution is to reconfigure Virgo a little:
* Copy com.springsource.javax.servlet-2.5.0.jar to lib/kernel
* Add  file:lib/kernel/com.springsource.javax.servlet-2.5.0.jar to launcher.Bundles in lib/org.eclipse.virgo.kernel.launch.properties
* Add  ch.qos.logback.* and, if it's not there already (depending on Virgo version), javax.* to packageImports in config/org.eclipse.virgo.kernel.userregion.properties