Archive

Archive for October, 2009

Maven – excluding jars in a EAR

October 25, 2009 Leave a comment

excluding transitive dependencies in a EAR.

<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-annotations</artifactId>
<version>3.2.0.ga</version>
<!–scope>provided</scope–>
<exclusions>
<exclusion>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
</exclusion>
</exclusions>
</dependency>

Categories: Tech stuff Tags: , , , ,

BlazeDS, JBoss 5 and JDK 1.5

October 21, 2009 Leave a comment

If you have to deploy a blazeDS application onto JBoss 5, you can run into number of issues.
In my scenario, the same blazeDS war worked in jboss 4.2.2, but would hang the Jboss server while getting deployed.

You know that it has something to do with JBoss classloading. And for sure, it turns to be the same thing.
After an hour or more of hung state, I get this exception

2009-10-20 20:55:58,995 WARN  [org.jboss.detailed.classloader.ClassLoaderManager] (main) Unexpected error during load of:javax.management.MBeanServer
java.lang.OutOfMemoryError: Java heap space
	at java.util.HashMap.resize(HashMap.java:508)
	at java.util.HashMap.addEntry(HashMap.java:799)
	at java.util.HashMap.put(HashMap.java:431)
	at java.util.HashSet.add(HashSet.java:194)
	at java.lang.ClassLoader.checkPackageAccess(ClassLoader.java:391)
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:675)
	at org.jboss.classloader.spi.base.BaseClassLoader.access$200(BaseClassLoader.java:63)
	at org.jboss.classloader.spi.base.BaseClassLoader$2.run(BaseClassLoader.java:572)
	at org.jboss.classloader.spi.base.BaseClassLoader$2.run(BaseClassLoader.java:532)
	at java.security.AccessController.doPrivileged(Native Method)
	at org.jboss.classloader.spi.base.BaseClassLoader.loadClassLocally(BaseClassLoader.java:530)
	at org.jboss.classloader.spi.base.BaseClassLoader.loadClassLocally(BaseClassLoader.java:507)
	at org.jboss.classloader.spi.base.BaseDelegateLoader.loadClass(BaseDelegateLoader.java:134)
	at org.jboss.classloader.spi.filter.FilteredDelegateLoader.loadClass(FilteredDelegateLoader.java:131)
	at org.jboss.classloader.spi.base.ClassLoadingTask$ThreadTask.run(ClassLoadingTask.java:452)
	at org.jboss.classloader.spi.base.ClassLoaderManager.nextTask(ClassLoaderManager.java:251)
	at org.jboss.classloader.spi.base.ClassLoaderManager.process(ClassLoaderManager.java:150)
	at org.jboss.classloader.spi.base.BaseClassLoaderDomain.loadClass(BaseClassLoaderDomain.java:265)
	at org.jboss.classloader.spi.base.BaseClassLoaderDomain.loadClass(BaseClassLoaderDomain.java:1119)
	at org.jboss.classloader.spi.base.BaseClassLoader.loadClassFromDomain(BaseClassLoader.java:798)
	at org.jboss.classloader.spi.base.BaseClassLoader.loadClass(BaseClassLoader.java:441)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
	at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:374)
	at flex.management.BaseControl.register(BaseControl.java:190)
	at flex.management.runtime.AdminConsoleDisplayRegistrar.(AdminConsoleDisplayRegistrar.java:40)
	at flex.management.runtime.messaging.MessageBrokerControl.(MessageBrokerControl.java:85)
	at flex.messaging.MessageBroker.(MessageBroker.java:269)
	at flex.messaging.config.MessagingConfiguration.createBroker(MessagingConfiguration.java:105)
	at flex.messaging.MessageBrokerServlet.init(MessageBrokerServlet.java:112)
	at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1048)
	at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:950)
2009-10-20 20:56:01,012 ERROR [STDERR] (main) **** MessageBrokerServlet failed to initialize due to runtime exception:   Error: java.lang.NoClassDefFoundError: javax/management/MBeanServer
	at flex.management.BaseControl.register(BaseControl.java:190)
	at flex.management.runtime.AdminConsoleDisplayRegistrar.(AdminConsoleDisplayRegistrar.java:40)
	at flex.management.runtime.messaging.MessageBrokerControl.(MessageBrokerControl.java:85)
	at flex.messaging.MessageBroker.(MessageBroker.java:269)
	at flex.messaging.config.MessagingConfiguration.createBroker(MessagingConfiguration.java:105)
	at flex.messaging.MessageBrokerServlet.init(MessageBrokerServlet.java:112)
	at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1048)
	at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:950)
	at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4122)
	at org.apache.catalina.core.StandardContext.start(StandardContext.java:4421)
	at org.jboss.web.tomcat.service.deployers.TomcatDeployment.performDeployInternal(TomcatDeployment.java:310)
	at org.jboss.web.tomcat.service.deployers.TomcatDeployment.performDeploy(TomcatDeployment.java:142)
	at org.jboss.web.deployers.AbstractWarDeployment.start(AbstractWarDeployment.java:461)
	at org.jboss.web.deployers.WebModule.startModule(WebModule.java:118)
	at org.jboss.web.deployers.WebModule.start(WebModule.java:97)
	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:592)
	at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:157)
	at org.jboss.mx.server.Invocation.dispatch(Invocation.java:96)
	at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
	at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
	at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:668)
	at org.jboss.system.microcontainer.ServiceProxy.invoke(ServiceProxy.java:206)
	at $Proxy38.start(Unknown Source)
	at org.jboss.system.microcontainer.StartStopLifecycleAction.installAction(StartStopLifecycleAction.java:42)
	at org.jboss.system.microcontainer.StartStopLifecycleAction.installAction(StartStopLifecycleAction.java:37)
	at org.jboss.dependency.plugins.action.SimpleControllerContextAction.simpleInstallAction(SimpleControllerContextAction.java:62)
	at org.jboss.dependency.plugins.action.AccessControllerContextAction.install(AccessControllerContextAction.java:71)
	at org.jboss.dependency.plugins.AbstractControllerContextActions.install(AbstractControllerContextActions.java:51)
	at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
	at org.jboss.system.microcontainer.ServiceControllerContext.install(ServiceControllerContext.java:286)
	at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1631)
	at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934)
	at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1082)
	at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984)
	at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:822)
	at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553)
	at org.jboss.system.ServiceController.doChange(ServiceController.java:688)
	at org.jboss.system.ServiceController.start(ServiceController.java:460)
	at org.jboss.system.deployers.ServiceDeployer.start(ServiceDeployer.java:163)
	at org.jboss.system.deployers.ServiceDeployer.deploy(ServiceDeployer.java:99)
	at org.jboss.system.deployers.ServiceDeployer.deploy(ServiceDeployer.java:46)
	at org.jboss.deployers.spi.deployer.helpers.AbstractSimpleRealDeployer.internalDeploy(AbstractSimpleRealDeployer.java:62)
	at org.jboss.deployers.spi.deployer.helpers.AbstractRealDeployer.deploy(AbstractRealDeployer.java:50)
	at org.jboss.deployers.plugins.deployers.DeployerWrapper.deploy(DeployerWrapper.java:171)
	at org.jboss.deployers.plugins.deployers.DeployersImpl.doDeploy(DeployersImpl.java:1439)
	at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1157)
	at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1178)
	at org.jboss.deployers.plugins.deployers.DeployersImpl.install(DeployersImpl.java:1098)
	at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
	at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1631)
	at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934)
	at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1082)
	at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984)
	at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:822)
	at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553)
	at org.jboss.deployers.plugins.deployers.DeployersImpl.process(DeployersImpl.java:781)
	at org.jboss.deployers.plugins.main.MainDeployerImpl.process(MainDeployerImpl.java:702)
	at org.jboss.system.server.profileservice.repository.MainDeployerAdapter.process(MainDeployerAdapter.java:117)
	at org.jboss.system.server.profileservice.repository.ProfileDeployAction.install(ProfileDeployAction.java:70)
	at org.jboss.system.server.profileservice.repository.AbstractProfileAction.install(AbstractProfileAction.java:53)
	at org.jboss.system.server.profileservice.repository.AbstractProfileService.install(AbstractProfileService.java:361)
	at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
	at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1631)
	at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934)
	at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1082)
	at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984)
	at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:822)
	at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553)
	at org.jboss.system.server.profileservice.repository.AbstractProfileService.activateProfile(AbstractProfileService.java:306)
	at org.jboss.system.server.profileservice.ProfileServiceBootstrap.start(ProfileServiceBootstrap.java:271)
	at org.jboss.bootstrap.AbstractServerImpl.start(AbstractServerImpl.java:461)
	at org.jboss.Main.boot(Main.java:221)
	at org.jboss.Main$1.run(Main.java:556)
	at java.lang.Thread.run(Thread.java:613)
2009-10-20 20:56:01,013 INFO  [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/celmi]] (main) Marking servlet MessageBrokerServlet as unavailable
2009-10-20 20:56:01,013 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/celmi]] (main) Servlet /celmi threw load() exception
javax.servlet.UnavailableException: javax/management/MBeanServer
	at flex.messaging.MessageBrokerServlet.init(MessageBrokerServlet.java:170)
	at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1048)
	at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:950)
	at orgapache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4122)
	at org.apache.catalina.core.StandardContext.start(StandardContext.java:4421)
	at org.jboss.web.tomcat.service.deployers.TomcatDeployment.performDeployInternal(TomcatDeployment.java:310)
	at org.jboss.web.tomcat.service.deployers.TomcatDeployment.performDeploy(TomcatDeployment.java:142)
	at org.jboss.web.deployers.AbstractWarDeployment.start(AbstractWarDeployment.java:461)
	at org.jboss.web.deployers.WebModule.startModule(WebModule.java:118)
	at org.jboss.web.deployers.WebModule.start(WebModule.java:97)
	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:592)
	at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:157)
	at org.jboss.mx.server.Invocation.dispatch(Invocation.java:96)
	at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
	at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
	at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:668)
	at org.jboss.system.microcontainer.ServiceProxy.invoke(ServiceProxy.java:206)
	at $Proxy38.start(Unknown Source)
	at org.jboss.system.microcontainer.StartStopLifecycleAction.installAction(StartStopLifecycleAction.java:42)
	at org.jboss.system.microcontainer.StartStopLifecycleAction.installAction(StartStopLifecycleAction.java:37)
	at org.jboss.dependency.plugins.action.SimpleControllerContextAction.simpleInstallAction(SimpleControllerContextAction.java:62)
	at org.jboss.dependency.plugins.action.AccessControllerContextAction.install(AccessControllerContextAction.java:71)
	at org.jboss.dependency.plugins.AbstractControllerContextActions.install(AbstractControllerContextActions.java:51)
	at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
	at org.jboss.system.microcontainer.ServiceControllerContext.install(ServiceControllerContext.java:286)
	at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1631)
	at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934)
	at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1082)
	at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984)
	at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:822)
	at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553)
	at org.jboss.system.ServiceController.doChange(ServiceController.java:688)
	at org.jboss.system.ServiceController.start(ServiceController.java:460)
	at org.jboss.system.deployers.ServiceDeployer.start(ServiceDeployer.java:163)
	at org.jboss.system.deployers.ServiceDeployer.deploy(ServiceDeployer.java:99)
	at org.jboss.system.deployers.ServiceDeployer.deploy(ServiceDeployer.java:46)
	at org.jboss.deployers.spi.deployer.helpers.AbstractSimpleRealDeployer.internalDeploy(AbstractSimpleRealDeployer.java:62)
	at org.jboss.deployers.spi.deployer.helpers.AbstractRealDeployer.deploy(AbstractRealDeployer.java:50)
	at org.jboss.deployers.plugins.deployers.DeployerWrapper.deploy(DeployerWrapper.java:171)
	at org.jboss.deployers.plugins.deployers.DeployersImpl.doDeploy(DeployersImpl.java:1439)
	at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1157)
	at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1178)
	at org.jboss.deployers.plugins.deployers.DeployersImpl.install(DeployersImpl.java:1098)
	at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
	at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1631)
	at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934)
	at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1082)
	at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984)
	at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:822)
	at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553)
	at org.jboss.deployers.plugins.deployers.DeployersImpl.process(DeployersImpl.java:781)
	at org.jboss.deployers.plugins.main.MainDeployerImpl.process(MainDeployerImpl.java:702)
	at org.jboss.system.server.profileservice.repository.MainDeployerAdapter.process(MainDeployerAdapter.java:117)
	at org.jboss.system.server.profileservice.repository.ProfileDeployAction.install(ProfileDeployAction.java:70)
	at org.jboss.system.server.profileservice.repository.AbstractProfileAction.install(AbstractProfileAction.java:53)
	at org.jboss.system.server.profileservice.repository.AbstractProfileService.install(AbstractProfileService.java:361)
	at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
	at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1631)
	at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934)
	at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1082)
	at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984)
	at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:822)
	at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553)
	at org.jboss.system.server.profileservice.repository.AbstractProfileService.activateProfile(AbstractProfileService.java:306)
	at org.jboss.system.server.profileservice.ProfileServiceBootstrap.start(ProfileServiceBootstrap.java:271)
	at org.jboss.bootstrap.AbstractServerImpl.start(AbstractServerImpl.java:461)
	at org.jboss.Main.boot(Main.java:221)
	at org.jboss.Main$1.run(Main.java:556)
	at java.lang.Thread.run(Thread.java:613)

I searched for MBeanServer in my classpath, and my blazeDS war did have a jmxri-1.2.1.jar in its lib folder.

I figured turning on the classloading logging might help. So, in jboss-log4j.xml

 <category name="org.jboss.classloading" additivity="false">
        <priority value="TRACE"></priority>
        <appender-ref ref="UCL"></appender-ref>
    </category>
    
    <category name="org.jboss.detailed.classloading" additivity="false">
        <priority value="TRACE"></priority>
        <appender-ref ref="UCL"></appender-ref>
    </category>
    
    <category name="flex.messaging" additivity="false">
        <priority value="TRACE"></priority>
        <appender-ref ref="UCL"></appender-ref>
    </category>
    

And then, I stumbled upon an infinite loop! I had to kill the process.

2009-10-20 23:03:17,452 TRACE [1789774,VFSClassLoaderPolicy,main] getProtectionDomain:className=javax.management.MBeanServer path=javax/management/MBeanServer.class codeSourceURL=jar:file:/jboss-5.1.0.GA/server/default/deploy/celmi.war!/WEB-INF/lib/jmxri-1.2.1.jar
2009-10-20 23:03:19,506 TRACE [1791828,VFSClassLoaderPolicy,main] getProtectionDomain:className=javax.management.MBeanServer path=javax/management/MBeanServer.class codeSourceURL=jar:file:/jboss-5.1.0.GA/server/default/deploy/celmi.war!/WEB-INF/lib/jmxri-1.2.1.jar
2009-10-20 23:03:19,517 TRACE [1791839,VFSClassLoaderPolicy,main] getProtectionDomain:className=javax.management.MBeanServer path=javax/management/MBeanServer.class codeSourceURL=jar:file:/jboss-5.1.0.GA/server/default/deploy/celmi.war!/WEB-INF/lib/jmxri-1.2.1.jar

Picked this up from stack-overflow.
If you’re running JBoss on Java 5 or above, then you’ll likely have 2 MBean servers running: the “platform” mbean server, which is hosted by the JVM, and the JBoss MBean server, which is hosted by the JBoss code. The two have nothing to do with each other.
Your code will register mbean in the JVM platform server, which is no use to you.

The easiest way to get a programmatic reference to the JBoss MBean server is

org.jboss.mx.util.MBeanServerLocator.locateJBoss()

Try using that instead of

ManagementFactory.getPlatformMBeanServer();

Steps to fix this:
1. Download BlazeDS code
2. Open up blazeds_src_3-0-0-544/modules/core/src/java/flex/management/BaseControl.java
3. Make the MBeanServer be pointed to the JBoss MBeanServer.

 public final void register()
    {
        if (!registered)
        {
            //MBeanServer server = MBeanServerLocatorFactory.getMBeanServerLocator().getMBeanServer();
             MBeanServer server =  org.jboss.mx.util.MBeanServerLocator.locateJBoss();

            ObjectName name = getObjectName();
            try
            {
                if (server.isRegistered(name))
                {
                    server.unregisterMBean(name);
                }

                registeredObjectName = server.registerMBean(this, name).getObjectName();
                registered = true;
                onRegistrationComplete();

            }
            catch (ManagementException me)
            {
                throw me;
            }
            catch (MBeanRegistrationException mre)
            {
                // Rethrow with useful message if this ever happens.
                ManagementException me = new ManagementException();
                me.setMessage(REG_EXCEPTION, new Object[] {name.toString()});
                me.setRootCause(mre);
                throw me;
            }
            catch (InstanceAlreadyExistsException iaee)
            {
                // If registration is not working at all, inform the user that
                // they may
                // work around the issue by disabling management (no MBeans will
                // be registered).
                if (!server.isRegistered(name))
                {
                    ManagementException me = new ManagementException();
                    me.setMessage(DISABLE_MANAGEMENT, new Object[] {name.toString()});
                    throw me;
                }
                else
                {
                    // Rethrow with useful message if this ever happens.
                    ManagementException me = new ManagementException();
                    me.setMessage(REG_ALREADYEXISTS, new Object[] {name.toString()});
                    throw me;
                }
            }
            catch (NotCompliantMBeanException ncme)
            {
                // Rethrow with useful message if this ever happens.
                ManagementException me = new ManagementException();
                me.setMessage(REG_NOTCOMPLIANT, new Object[] {name.toString()});
                throw me;
            }
            catch (InstanceNotFoundException infe)
            {
                // Rethrow with useful message if this ever happens.
                ManagementException me = new ManagementException();
                me.setMessage(UNREG_NOTFOUND, new Object[] {name.toString()});
                throw me;
            }
        }
    }

4. Create a patch of this file and name it such that it is picked up before blazeds*.
5. Add it in your lib directory of your BlazeDS war app, and voila!

Categories: Tech stuff