13 Replies Latest reply on Apr 19, 2012 2:58 PM by lightguard

    Seam 3.1, Glassfish Embedded and Arquillian Problem

    jfconavarrete

      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

          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
            lightguard

            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
              jfconavarrete

              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
                jfconavarrete

                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
                  jfconavarrete

                  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
                    lightguard

                    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

                      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

                        Hi,

                         

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

                         

                         

                        {code:xml}



                        <dependency>



                        <groupId>javax.enterprise</groupId>



                        <artifactId>cdi-api</artifactId>



                        <version>1.0</version>



                        <scope>provided</scope>


                        </dependency>

                        {code}

                         

                        before glassfish-embedded-all.

                         

                        Regards

                        • 9. Re: Seam 3.1, Glassfish Embedded and Arquillian Problem
                          bri256

                          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
                            bri256

                            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.

                            • 11. Re: Seam 3.1, Glassfish Embedded and Arquillian Problem
                              lightguard
                              • 12. Re: Seam 3.1, Glassfish Embedded and Arquillian Problem
                                bri256

                                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
                                  lightguard

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