13 Replies Latest reply: Apr 19, 2012 2:58 PM by Jason Porter RSS

Seam 3.1, Glassfish Embedded and Arquillian Problem

Juan Francisco Navarrete Newbie

I created an integration test using Embedded Glassfish 3.1 and Arquillian 1.0.0.Final-SNAPSHOT for a sample application that uses Seam 3.1.0 Final. When embedded glassfish starts running and tries to deploy the application the following exception is thrown




GRAVE: Exception while loading the app : Error instantiating class org.jboss.solder.servlet.logging.TypedMessageBundleAndLoggerExtension
java.lang.RuntimeException: Error instantiating class org.jboss.solder.servlet.logging.TypedMessageBundleAndLoggerExtension
     at org.jboss.weld.util.ServiceLoader.prepareInstance(ServiceLoader.java:282)
     at org.jboss.weld.util.ServiceLoader.loadService(ServiceLoader.java:238)
     at org.jboss.weld.util.ServiceLoader.loadServiceFile(ServiceLoader.java:194)
     at org.jboss.weld.util.ServiceLoader.reload(ServiceLoader.java:157)
     at org.jboss.weld.util.ServiceLoader.iterator(ServiceLoader.java:346)
     at org.jboss.weld.bootstrap.ExtensionBeanDeployer.addExtensions(ExtensionBeanDeployer.java:93)
     at org.jboss.weld.bootstrap.WeldBootstrap.startInitialization(WeldBootstrap.java:334)
     at org.glassfish.weld.WeldDeployer.event(WeldDeployer.java:168)
     at org.glassfish.kernel.event.EventsImpl.send(EventsImpl.java:128)
     at org.glassfish.internal.data.ApplicationInfo.load(ApplicationInfo.java:262)
     at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:460)
     at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:240)
     at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:370)
     at com.sun.enterprise.v3.admin.CommandRunnerImpl$1.execute(CommandRunnerImpl.java:359)
     at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:369)
     at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1080)
     at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1200(CommandRunnerImpl.java:95)
     at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1260)
     at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1248)
     at com.sun.enterprise.admin.cli.embeddable.CommandExecutorImpl.executeCommand(CommandExecutorImpl.java:118)
     at com.sun.enterprise.admin.cli.embeddable.DeployerImpl.deploy(DeployerImpl.java:97)
     at com.sun.enterprise.admin.cli.embeddable.DeployerImpl.deploy(DeployerImpl.java:88)
     at org.jboss.arquillian.container.glassfish.embedded_3_1.GlassFishContainer.deploy(GlassFishContainer.java:190)
     at org.jboss.arquillian.container.impl.client.container.ContainerDeployController$3.call(ContainerDeployController.java:148)
     at org.jboss.arquillian.container.impl.client.container.ContainerDeployController$3.call(ContainerDeployController.java:115)
     at org.jboss.arquillian.container.impl.client.container.ContainerDeployController.executeOperation(ContainerDeployController.java:258)
     at org.jboss.arquillian.container.impl.client.container.ContainerDeployController.deploy(ContainerDeployController.java:114)
     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:597)
     at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:90)
     at org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.java:99)
     at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:81)
     at org.jboss.arquillian.container.impl.client.container.DeploymentExceptionHandler.verifyExpectedExceptionDuringDeploy(DeploymentExceptionHandler.java:50)
     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:597)
     at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:90)
     at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:88)
     at org.jboss.arquillian.container.impl.client.ContainerDeploymentContextHandler.createDeploymentContext(ContainerDeploymentContextHandler.java:78)
     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:597)
     at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:90)
     at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:88)
     at org.jboss.arquillian.container.impl.client.ContainerDeploymentContextHandler.createContainerContext(ContainerDeploymentContextHandler.java:57)
     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:597)
     at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:90)
     at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:88)
     at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:134)
     at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:114)
     at org.jboss.arquillian.core.impl.EventImpl.fire(EventImpl.java:67)
     at org.jboss.arquillian.container.impl.client.container.ContainerDeployController$1.perform(ContainerDeployController.java:86)
     at org.jboss.arquillian.container.impl.client.container.ContainerDeployController$1.perform(ContainerDeployController.java:79)
     at org.jboss.arquillian.container.impl.client.container.ContainerDeployController.forEachDeployment(ContainerDeployController.java:250)
     at org.jboss.arquillian.container.impl.client.container.ContainerDeployController.forEachManagedDeployment(ContainerDeployController.java:226)
     at org.jboss.arquillian.container.impl.client.container.ContainerDeployController.deployManaged(ContainerDeployController.java:78)
     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:597)
     at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:90)
     at org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.java:99)
     at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:81)
     at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:134)
     at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:114)
     at org.jboss.arquillian.core.impl.EventImpl.fire(EventImpl.java:67)
     at org.jboss.arquillian.container.test.impl.client.ContainerEventController.execute(ContainerEventController.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:597)
     at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:90)
     at org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.java:99)
     at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:81)
     at org.jboss.arquillian.test.impl.TestContextHandler.createClassContext(TestContextHandler.java:75)
     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:597)
     at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:90)
     at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:88)
     at org.jboss.arquillian.test.impl.TestContextHandler.createSuiteContext(TestContextHandler.java:60)
     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:597)
     at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:90)
     at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:88)
     at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:134)
     at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:114)
     at org.jboss.arquillian.test.impl.EventTestRunnerAdaptor.beforeClass(EventTestRunnerAdaptor.java:80)
     at org.jboss.arquillian.junit.Arquillian$2.evaluate(Arquillian.java:158)
     at org.jboss.arquillian.junit.Arquillian.multiExecute(Arquillian.java:290)
     at org.jboss.arquillian.junit.Arquillian.access$100(Arquillian.java:45)
     at org.jboss.arquillian.junit.Arquillian$3.evaluate(Arquillian.java:175)
     at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
     at org.jboss.arquillian.junit.Arquillian.run(Arquillian.java:123)
     at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:53)
     at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:123)
     at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:104)
     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:597)
     at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:164)
     at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:110)
     at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:175)
     at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcessWhenForked(SurefireStarter.java:107)
     at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:68)
Caused by: java.lang.NullPointerException
     at org.jboss.solder.servlet.logging.TypedMessageBundleAndLoggerExtension.<init>(TypedMessageBundleAndLoggerExtension.java:57)
     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 org.jboss.weld.util.ServiceLoader.prepareInstance(ServiceLoader.java:273)
     ... 115 more



My test class looks like this




@RunWith(Arquillian.class)
public class AuthenticatorImplIntegrationTest {

    @Deployment
    public static WebArchive createTestArchive() {
        MavenDependencyResolver resolver = DependencyResolvers.use(MavenDependencyResolver.class).loadMetadataFromPom("pom.xml");
        return ShrinkWrap.create(WebArchive.class, "test.war")
                .addAsLibraries(resolver.artifact("org.jboss.solder:solder-impl")
                .resolveAsFiles()).addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml");
    }

    @Test
    public void test() {
        System.out.println("Hello!");
    }
}



The problem seems to be in the TypedMessageBundleAndLoggerExtension class of Seam Solder.


Exactly in this line of code




processTypesInModule = System.getProperty("glassfish.version") != null && cdi.getImplementationTitle().contains("Weld")
                && cdi.getImplementationVersion().equals("20110114-1644");



TypedMessageBundleAndLoggerExtension


where cdi.getImplementationTitle() and cdi.getImplementationVersion() return null, causing the NullPointerException.


Does someone know a workaround for this issue?


Thanks in advance

  • 1. Re: Seam 3.1, Glassfish Embedded and Arquillian Problem
    hantsy bai Master

    Add another solder logging in the deployment and have a try.


    .addAsLibraries(resolver.artifact("org.jboss.solder:solder-logging")
    

  • 2. Re: Seam 3.1, Glassfish Embedded and Arquillian Problem
    Jason Porter Master

    If you're using Glassfish you'll also need jboss-logging.


    Embedded glassfish has all kinds of problems that others have also run into. In general embedded containers are simply not a good way to go. A managed or remote server is better, and it'll actually be the same environment (or very close to) what you'll be deploying on.

  • 3. Re: Seam 3.1, Glassfish Embedded and Arquillian Problem
    Juan Francisco Navarrete Newbie

    hantsy bai wrote on Jan 30, 2012 23:37:


    Add another solder logging in the deployment and have a try.

    .addAsLibraries(resolver.artifact("org.jboss.solder:solder-logging")
    




    MavenDependencyResolver adds the requiered dependencies of an artifact to the final WAR file so


    .addAsLibraries(resolver.artifact("org.jboss.solder:solder-impl").resolveAsFiles())



    automatically adds solder-logging.


    Anyway I included your suggestion in the test but it still doesnt work, i get the same error :(

  • 4. Re: Seam 3.1, Glassfish Embedded and Arquillian Problem
    Juan Francisco Navarrete Newbie

    Thank you both for your replies,


    I will try with the managed server and keep you informed


    Have a great day

  • 5. Re: Seam 3.1, Glassfish Embedded and Arquillian Problem
    Juan Francisco Navarrete Newbie

    Jason Porter wrote on Jan 30, 2012 23:45:


    If you're using Glassfish you'll also need jboss-logging.

    Embedded glassfish has all kinds of problems that others have also run into. In general embedded containers are simply not a good way to go. A managed or remote server is better, and it'll actually be the same environment (or very close to) what you'll be deploying on.


    Jason,


    I chose the embedded option because I want my CI server to run the integration tests. This CI server runs in the cloud (Cloudbees Jenkins CI) and it has no access to a remote application server. Do you know how i can get a solution for this?


    Thanks in advance

  • 6. Re: Seam 3.1, Glassfish Embedded and Arquillian Problem
    Jason Porter Master

    I know Aslak has this working on cloudbees. I think what he ended up doing was setting up AS on RUN@Cloud.  Another way is to have maven download AS, unzip it and then use that location as JBOSS_HOME.

  • 7. Re: Seam 3.1, Glassfish Embedded and Arquillian Problem
    hantsy bai Master

    The recommended approach is using a managed container for CI and using embeded and remote container for development.

  • 8. Re: Seam 3.1, Glassfish Embedded and Arquillian Problem
    blep Newbie

    Hi,

     

    I fixed the same problem by adding the followin dep in maven:

     

     

    <dependency><groupId>javax.enterprise</groupId><artifactId>cdi-api</artifactId><version>1.0</version><scope>provided</scope></dependency>

     

     

    before glassfish-embedded-all.

     

    Regards

  • 9. Re: Seam 3.1, Glassfish Embedded and Arquillian Problem
    Brian Reilly Newbie

    I've tried adding the various dependencies suggested above (solder-logging, jboss-logging, cdi-api) and none of them fixed the problem for me (glassfish embedded 3.1.2). Adding cdi-api got past the error in the original question but caused a different error. The stack trace is huge, but I think it boils down to:

     

    Caused by: java.lang.NullPointerException

        at org.jboss.seam.faces.environment.SeamApplicationFactory.getApplication(SeamApplicationFactory.java:49)

        at com.sun.faces.application.InjectionApplicationFactory.getApplication(InjectionApplicationFactory.java:91)

        at com.sun.faces.config.processor.AbstractConfigProcessor.getApplication(AbstractConfigProcessor.java:130)

        at com.sun.faces.config.processor.ApplicationConfigProcessor.process(ApplicationConfigProcessor.java:255)

        at com.sun.faces.config.processor.AbstractConfigProcessor.invokeNext(AbstractConfigProcessor.java:114)

        at com.sun.faces.config.processor.LifecycleConfigProcessor.process(LifecycleConfigProcessor.java:116)

        at com.sun.faces.config.processor.AbstractConfigProcessor.invokeNext(AbstractConfigProcessor.java:114)

        at com.sun.faces.config.processor.FactoryConfigProcessor.process(FactoryConfigProcessor.java:222)

        at com.sun.faces.config.ConfigManager.initialize(ConfigManager.java:360)

        ... 136 more

     

    Adding cdi-api seems to be getting in the way of Glassfish resolving SeamApplicationFactory. This fix feels like a dead end to me.

     

    More promising to me is the source of the actual error: org.jboss.solder.servlet.logging.TypedMessageBundleAndLoggerExtension.java:57:

     

              processTypesInModule = System.getProperty("glassfish.version") != null && cdi.getImplementationTitle().contains("Weld")

                        && cdi.getImplementationVersion().equals("20110114-1644");

     

    Using a debugger, it's easy to see that cdi.getImplementationTitle() and cdi.getImplementationVersion() are returning null. Two things about this:

     

    1. It looks like it's checking for Weld version 20110114-1644, which I'm sure Glassfish 3.1.2 has moved past.
    2. The javadoc for TypedMessageBundleAndLoggerExtension says, "Adds TypedMessageBundleAndLoggerProducers to the deployment, and detects and installs beans for any typed loggers defined. TEMPORARY UNTIL GLASSFISH-15735 is resolved". This seems outdated for current Glassfish versions since GLASSFISH-15735 is resolved (>= 3.1.1_b05).

     

    Obviously, this was necessary at some point in time, and is probably still necessary for some version of Glassfish. However, it seems to be breaking the current version.

     

    I think either there needs to be a null check on cdi.getImplementationTitle() and cdi.getImplementationVersion() or, if GLASSFISH-15735 is truly resolved, this extension needs to be disabled altogether for Glassfish >= 3.1.1. The other possibility is that getImplementationTitle() shouldn't be returning null, which could be a problem with Glassfish or Weld, though the JavaDoc for getImplementationTitle() says that it returns "the title of the implementation, null is returned if it is not known".

     

    I'm going to try to grab the solder source and see what happens if I add the null checks. I don't know how to go about approaching the other possible solutions, so if anyone has any suggestions for those, please chime in. Thanks.

  • 10. Re: Seam 3.1, Glassfish Embedded and Arquillian Problem
    Brian Reilly Newbie

    I tried a modification of TypedMessageBundleAndLoggerExtension to get passed the NullPointerException and, unfortunately, I got back to the NullPointerException from SeamApplicationFactory.getApplication() that I got when adding the cdi-api dependency. At least that's consistent with that addition working for blep. There must be something different now causing the NPE from SeamApplicationFactory.getApplication(). I'm going to keep looking into that, but please let me know if anyone has any ideas.

     

    I still think that TypedMessageBundleAndLoggerExtension should be fixed so that cdi-api is not necessary. It seems like a redundant dependency to me and completely non-obvious when reading the POM.

     

    Thanks.

  • 12. Re: Seam 3.1, Glassfish Embedded and Arquillian Problem
    Brian Reilly Newbie

    Thanks Jason. I hadn't seen that. I think I can get on board with that viewpoint. It seems like a lot of wasted effort on the part of the container authors to support running embedded if there are problems like that that can't be solved. Would it make sense to file bugs against the embedded container implementations for things like this?

  • 13. Re: Seam 3.1, Glassfish Embedded and Arquillian Problem
    Jason Porter Master

    I don't see why not. What's the worst that can happen, they ignore it or don't fix it?