Hi Denis, I've already checked your post (very instructive, thanks). I'm sure SINGLE_CLASSLOADER for ear will resolve this issue. Problem is I don't know how to specify it in JBoss AS 7 (I don't think it's supported - JBoss always creates an isolated classloader for each war)
Going to use your instructions for WAS in the future (I'm using both JBoss AS 7 and WAS 8). For the moment, no problem with WAS 8 and ear packaging, everything is under WEB-INF/lib (no EJB Timer for the moment). BTW, updated sample app (moved codi to ear) : it's in ear branch https://github.com/gonzalad/codi-ear-viewaccessscoped/tree/ear If I don't find a packaging solution, perhaps I'll give a try modifying locally CODI code, but not sure which approach is best (the 3rd one perhaps but not sure it will work ;( ) : Sorry those are rough notes, and I don't master CDI : 1. modify ClassUtils.getClassloader add a configurationparameter to return ClassUtils.class.getClassloader(). cons : we're still relying on classloader and potentially will have a pb with another appserver. 2. remove @JsfPhaseListener and rely on classic phaseListeners configured with faces-config.xml cons : non CDI 3. use CDI to communicate phaseListener class in CODI consumeJsfPhaseListener i.e. we could perhaps add dynamically a bean or producer of type Class with a custom annotation, i.e. @JsfPhaseListener Class. then in consumer, we @Inject @JsfPhaseListener Instance<Class> jsfPhaseListenerClasses Afterwards, we instanciate phaseListener iterating on jsfPhaseListenerClasses.iterator(). cons : make a test with a JsfPhaseListener1 in webapp1 and JSFPhaseListener2 in webapp2, both being in the same EAR. Check that webapp1 has only listener JsfPhaseListener1 and not both of them. ________________________________ De : titou10 titou10 <titou10.tito...@gmail.com> À : MyFaces Discussion <users@myfaces.apache.org>; Adrian Gonzalez <adr_gonza...@yahoo.fr> Envoyé le : Mardi 19 mars 2013 22h37 Objet : Re: CODI ViewAccessScoped issue with EAR on JBoss 7.1.x Maybe you should check my previous post named "CODI jar in ear/lib with a WAR = fail in WebSphere v8.5" and then "Does CODI supports to be deployed in a app server that uses multi-classloader..." started January 17 because it seems that you have the same problem we have with WebSphere v8.5 If I try to deploy the CODI jar into ear/lib, some PhaseListener magical initialisation was not working at startup (=first page accessed)... And I also have the same feeling as you that this is the way CODI use the classloaders that causes the problem ... The only solutions we found: configure WAS to use only 1 classloader for all the modules in the ear, (but this is not supported by the OWB implementation packaged with WAS), or deploy everything in war WEB-INF/lib, including the ejb jars. In fact we put "any module that uses CDI (inject/producers)" in web-inf/lib and the other in ear/lib (slf4j, hibernate, jpa module etc) This is what we are doing even if I don't like it... Mark Struberg answered that he was using CODI with a multi level CL without problem... 2013/3/19 Adrian Gonzalez <adr_gonza...@yahoo.fr>: > I've just put myfaces-extcdi-bundle-jsf20-1.0.5.jar into ear (and removed it > from WEB-INF/lib), no more luck. > > I'll try to update my sample tomorrow with ear packaging and debug it. > > Thanks once more for the help Christian ! > > P.S. I'm wondering if the root cause of this bug isn't in CODI (classloader > usage in Java EE & CDI appears to be under-specified, so I'm not sure a CDI > extension should rely on TCCL for its internals) > > > ________________________________ > De : Christian Beikov <c.bei...@curecomp.com> > À : users@myfaces.apache.org > Envoyé le : Mardi 19 mars 2013 21h20 > Objet : Re: CODI ViewAccessScoped issue with EAR on JBoss 7.1.x > > I used the xml file to be able to put the CODI bundle into EAR/lib. > The problem was that JSF is not on the classpath which the deployment > xml should fix. > My CODI bundle is currently in EAR/lib and it deploys successfully with > this configuration. > > Am 19.03.2013 20:43, schrieb Adrian Gonzalez: >> Hi Christian, >> >> Thanks for the tip ! >> >> Just made a quick test using your file with my sample, but no luck, it >> doesn't work. >> I'm using JBoss jsf impl (so no jsf jars in my app). >> I've also putting myfaces-extcdi-bundle-jsf20-1.0.5.jar in the war, >> WEB-INF/lib. >> >> Do you have the same setup ? >> >> >> ________________________________ >> De : Christian Beikov <c.bei...@curecomp.com> >> À : users@myfaces.apache.org >> Envoyé le : Mardi 19 mars 2013 17h18 >> Objet : Re: CODI ViewAccessScoped issue with EAR on JBoss 7.1.x >> >> Hey, >> >> I had the same problem a time ago. Just add following >> jboss-deployment-structure.xml into META-INF of the EAR: >> >> <?xml version="1.0" encoding="UTF-8"?> >> <jboss-deployment-structure> >> <!-- Make sub deployments isolated by default, so they cannot see each >>others >> classes without a Class-Path entry --> >> <ear-subdeployments-isolated>true</ear-subdeployments-isolated> >> <!-- This corresponds to the top level deployment. For a war this is the >> war's module, for an ear --> >> <!-- This is the top level ear module, which contains all the classes in >> the EAR's lib folder --> >> <deployment> >> <!-- This allows you to define additional dependencies, it is the >>same >> as using the Dependencies: manifest attribute --> >> <dependencies> >> <module name="org.w3c.css.sac" /> >> <module name="net.sourceforge.cssparser" /> >> <module name="com.sun.jsf-impl" /> >> <module name="javax.api" /> >> <module name="javax.faces.api" /> >> <module name="javax.xml.bind.api" /> >> <module name="javax.xml.jaxp-provider" /> >> <module name="com.google.guava" /> >> </dependencies> >> </deployment> >> </jboss-deployment-structure> >> >> Am 19.03.2013 16:34, schrieb Adrian Gonzalez: >>> Hello, >>> >>> This is a follow up on >>> http://mail-archives.apache.org/mod_mbox/myfaces-users/201212.mbox/%3c1354617133.46780.yahoomail...@web172404.mail.ir2.yahoo.com%3E. >>> >>> @ViewAccessScoped is not working when deploying an EAR on JBoss 7.1.0 >>> (tested it with 7.1.3 same result). >>> If I deploy only a war, it works. >>> Sample project is here [1]. >>> >>> I used the debugguer and found that when using and EAR : >>> * the classloader obtained in PhaseListenerExtension#addPhaseListener >>>is the EAR classloader >>> ModuleClassLoader for Module >>>"deployment.viewaccessscoped-ear.ear:main" from Service Module Loader >>> * the classloader obtained in >>>consumePhaseListeners#consumePhaseListeners() is the WAR classloader >>> ModuleClassLoader for Module >>>"deployment.viewaccessscoped-ear.ear.viewaccessscoped-web.war:main" from >>>Service Module Loader >>> >>> This means that phaselisteners annotated with @JsfPhaseListener are not >>> executed. >>> >>> The following phaselisteners are not registered with the war classloader >>> when using an EAR : >>> * class >>>org.apache.myfaces.extensions.cdi.jsf.impl.config.view.PhasesLifecycleCallbackPhaseListener >>> * class >>>org.apache.myfaces.extensions.cdi.jsf.impl.listener.phase.JsfRequestLifecyclePhaseListener >>> >>> Thanks for the help ! >>> >>> [1] Sample project here : >>> https://github.com/gonzalad/codi-ear-viewaccessscoped >>> To reproduce it, >>> 1. Testing the war >>> a. add the war on JBoss >>> b. http://localhost:8080/viewaccessscoped-web/test.faces >>> you'll see on sysout that CODI ViewAccessScoped bean has been >>>instantiated >>> 16:24:52,778 INFO [stdout] (http--0.0.0.0-8080-1) @PostConstruct >>> c. click on first link. >>> you should see nothing on sysout (this means the previous bean >>>instance is reused) >>> 1. Testing the ear - incorrect behaviour >>> a. add the ear on JBoss (remove the previous war) >>> b. http://localhost:8080/viewaccessscoped-web/test.faces >>> you'll see on sysout that CODI ViewAccessScoped bean has been >>>instantiated >>> 16:22:49,186 INFO [stdout] (http--0.0.0.0-8080-1) @PostConstruct >>> c. click on first link. >>> you'll see on sysout that previous CODI ViewAccessScoped instance >>>has been destroyed and a new one is created. >>> 16:23:24,389 INFO [stdout] (http--0.0.0.0-8080-1) @PreDestroy >>> 16:23:24,389 INFO [stdout] (http--0.0.0.0-8080-1) @PostConstruct >>>