Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Inability to use WebLogic native support without providing Tomcat, JBossWeb, etc. libs #873

Closed
Alexander-Kiselyov opened this issue Jan 30, 2013 · 9 comments
Labels

Comments

@Alexander-Kiselyov
Copy link

Hello,

Following exception occurs during attempt to deploy WAR, which contains atmosphere-weblogic and uses org.atmosphere.weblogic.AtmosphereWebLogicServlet:

java.lang.NoClassDefFoundError: org/apache/catalina/CometProcessor
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
    at weblogic.utils.classloaders.GenericClassLoader.defineClass(GenericClassLoader.java:335)
    at weblogic.utils.classloaders.GenericClassLoader.findLocalClass(GenericClassLoader.java:288)
    at weblogic.utils.classloaders.GenericClassLoader.findClass(GenericClassLoader.java:256)
    at weblogic.utils.classloaders.ChangeAwareClassLoader.findClass(ChangeAwareClassLoader.java:54)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
    at weblogic.utils.classloaders.GenericClassLoader.loadClass(GenericClassLoader.java:176)
    at weblogic.utils.classloaders.ChangeAwareClassLoader.loadClass(ChangeAwareClassLoader.java:35)
    at org.atmosphere.weblogic.AtmosphereWebLogicServlet.<clinit>(AtmosphereWebLogicServlet.java:38)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
&lt; s k i p p e d &gt;
    at weblogic.deploy.internal.targetserver.DeploymentManager.activateDeploymentList(DeploymentManager.java:1227)
    at weblogic.deploy.internal.targetserver.DeploymentManager.handleCommit(DeploymentManager.java:436)
    at weblogic.deploy.internal.targetserver.DeploymentServiceDispatcher.commit(DeploymentServiceDispatcher.java:164)
    at weblogic.deploy.service.internal.targetserver.DeploymentReceiverCallbackDeliverer.doCommitCallback(DeploymentReceiverCallbackDeliverer.java:181)
    at weblogic.deploy.service.internal.targetserver.DeploymentReceiverCallbackDeliverer.access$100(DeploymentReceiverCallbackDeliverer.java:12)
    at weblogic.deploy.service.internal.targetserver.DeploymentReceiverCallbackDeliverer$2.run(DeploymentReceiverCallbackDeliverer.java:68)
    at weblogic.work.SelfTuningWorkManagerImpl$WorkAdapterImpl.run(SelfTuningWorkManagerImpl.java:516)
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201)
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:173)
java.lang.NoClassDefFoundError: org/apache/catalina/CometProcessor
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
    at weblogic.utils.classloaders.GenericClassLoader.defineClass(GenericClassLoader.java:335)
    at weblogic.utils.classloaders.GenericClassLoader.findLocalClass(GenericClassLoader.java:288)
    at weblogic.utils.classloaders.GenericClassLoader.findClass(GenericClassLoader.java:256)
    at weblogic.utils.classloaders.ChangeAwareClassLoader.findClass(ChangeAwareClassLoader.java:54)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
    at weblogic.utils.classloaders.GenericClassLoader.loadClass(GenericClassLoader.java:176)
    at weblogic.utils.classloaders.ChangeAwareClassLoader.loadClass(ChangeAwareClassLoader.java:35)
    at org.atmosphere.weblogic.AtmosphereWebLogicServlet.<clinit>(AtmosphereWebLogicServlet.java:38)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at java.lang.Class.newInstance0(Class.java:355)
    at java.lang.Class.newInstance(Class.java:308)
    at weblogic.servlet.internal.WebComponentContributor.getNewInstance(WebComponentContributor.java:227)
    at weblogic.servlet.internal.WebComponentContributor.createServletInstance(WebComponentContributor.java:251)
    at weblogic.servlet.internal.StubSecurityHelper$ServletInitAction.run(StubSecurityHelper.java:255)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
    at weblogic.security.service.SecurityManager.runAs(Unknown Source)
    at weblogic.servlet.internal.StubSecurityHelper.createServlet(StubSecurityHelper.java:64)
    at weblogic.servlet.internal.StubLifecycleHelper.createOneInstance(StubLifecycleHelper.java:58)
    at weblogic.servlet.internal.StubLifecycleHelper.<init>(StubLifecycleHelper.java:48)
    at weblogic.servlet.internal.ServletStubImpl.prepareServlet(ServletStubImpl.java:521)
    at weblogic.servlet.internal.WebAppServletContext.preloadServlet(WebAppServletContext.java:1896)
    at weblogic.servlet.internal.WebAppServletContext.loadServletsOnStartup(WebAppServletContext.java:1873)
    at weblogic.servlet.internal.WebAppServletContext.preloadResources(WebAppServletContext.java:1793)
    at weblogic.servlet.internal.WebAppServletContext.start(WebAppServletContext.java:3003)
    at weblogic.servlet.internal.WebAppModule.startContexts(WebAppModule.java:1375)
    at weblogic.servlet.internal.WebAppModule.start(WebAppModule.java:470)
    at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:205)
&lt; s k i p p e d &gt;
    at weblogic.deploy.internal.targetserver.DeploymentManager.handleDeploymentCommit(DeploymentManager.java:820)
    at weblogic.deploy.internal.targetserver.DeploymentManager.activateDeploymentList(DeploymentManager.java:1227)
    at weblogic.deploy.internal.targetserver.DeploymentManager.handleCommit(DeploymentManager.java:436)
    at weblogic.deploy.internal.targetserver.DeploymentServiceDispatcher.commit(DeploymentServiceDispatcher.java:164)
    at weblogic.deploy.service.internal.targetserver.DeploymentReceiverCallbackDeliverer.doCommitCallback(DeploymentReceiverCallbackDeliverer.java:181)
    at weblogic.deploy.service.internal.targetserver.DeploymentReceiverCallbackDeliverer.access$100(DeploymentReceiverCallbackDeliverer.java:12)
    at weblogic.deploy.service.internal.targetserver.DeploymentReceiverCallbackDeliverer$2.run(DeploymentReceiverCallbackDeliverer.java:68)
    at weblogic.work.SelfTuningWorkManagerImpl$WorkAdapterImpl.run(SelfTuningWorkManagerImpl.java:516)
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201)
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:173)

Problem is actually simple: line 38 of AtmosphereWebLogicServlet refers to AtmosphereServlet, which, in turn, implements org.apache.catalina.CometProcessor, org.jboss.servlet.http.HttpEventServlet:

protected static final Logger logger = LoggerFactory.getLogger(AtmosphereServlet.class);

According to the JLS, class literals will cause classloader to load class, and during this process NoClassDefFoundError can be thrown, exactly as in this case.
Not sure, whether it is an intended behaviour (that AtmosphereWebLogicServlet's logger is named equal to AtmosphereServlet's) or just a mistake.

Also, I've noted that Maven artifact atmosphere-runtime depends on atmosphere-compat-jbossweb, atmosphere-compat-tomcat, etc., so if one will assemble an app using Maven and won't exclude these artifacts - no problem will (obviously) occur. Is it actually possible to decouple runtime from container-specific artefacts?
"Structure of an Atmosphere's Application" states that: "You can remove some of the file if you don't need portability."

@jfarcand
Copy link
Member

You need all the atmosphere-compat-xxx dependendencies to make it work. If you use Maven that should not be a problem?

@Alexander-Kiselyov
Copy link
Author

Yes, with Maven it isn't a problem, as I said. But:

  1. Documentation clearly says otherwise.
  2. It seems illogical to force WebLogic-only (or Tomcat-only, etc.) users to drag irrelevant compatibility libraries.

@jfarcand
Copy link
Member

Na just spotted the issue. I will fix the logging issue, and that should make it work.

jfarcand added a commit that referenced this issue Jan 30, 2013
@jfarcand
Copy link
Member

Fixed. Try 1.0.10-SNAPSHOT (atmosphere-weblogic-1.0.10-20130130.203304-21.jar)

@Alexander-Kiselyov
Copy link
Author

Thanks. Could you please tell, are there a lot of couplings between primary and compatibility libraries?

@jfarcand
Copy link
Member

If you look at Atmosphere code, and to make it work with all Server, dependencies like this are required. Just exclude the atmosphere-compat-* from your pom.xml and Atmosphere will work. It is not a choice to do that, but to make sure application are portable.

@jfarcand
Copy link
Member

No, small coupling and class are loaded by reflection, hence no issues unless a bug. I will also exclude the compat dependencies from atmosphere-weblogic so you should be fine. Give me 10 minutes

@Alexander-Kiselyov
Copy link
Author

Thanks a lot, great responsiveness. I'm just researching the Atmosphere for potential use in my project and seems it's the right choice :)

jfarcand added a commit that referenced this issue Jan 30, 2013
@jfarcand
Copy link
Member

Ok fixed. Let me know how it goes.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants