9 Replies Latest reply on Jul 31, 2009 3:30 PM by alesj

    Injecting a classloader

    dmlloyd

      In order to support per-deployment log contexts, I have to introspect the deployment unit which contains the jboss-logging.xml file that is being deployed, in order to inject any and all of the classloaders which correspond to the deployment unit and its children into the log context instance.

      Where is the classloader information stored in a deployment unit, and is there any way to access it from a BeanMetaDataFactory which is created via SchemaResolverDeployer?

        • 1. Re: Injecting a classloader
          jaikiran

          Isn't it in

          org.jboss.deployers.structure.spi.DeploymentUnit.getClassLoader();


          Or are you looking for something else?


          • 2. Re: Injecting a classloader
            dmlloyd

            Yeah, that should work for the parent. Is there any way to find all the nested deployment units though? I see the *Component(String) methods however there does not seem to be a way to list what the components are.

            • 3. Re: Injecting a classloader
              dmlloyd

              Ah, never mind that question, I see there's a visit() method. Now another question: do nested JARs which are just libraries qualify as deployment units? And, how can I get access to the DeploymentUnit instance from my deployer?

              • 4. Re: Injecting a classloader
                jaikiran

                 

                "david.lloyd@jboss.com" wrote:
                do nested JARs which are just libraries qualify as deployment units?

                No, they are not considered deployment units. Although i don't exactly know how such jars are represented or accessed from a deployment unit. Probably they end up as some kind of metadata? Ales?

                "david.lloyd@jboss.com" wrote:

                And, how can I get access to the DeploymentUnit instance from my deployer?


                Through your deployer, you tell the deployer framework about the deployment units you are interested in and the stage when you are interested in:
                public MyDeployer()
                {
                 setInput(SomeMetadata.class);
                 setStage(POST_CLASSLOADER);
                }
                


                The deployer framework is then responsible for passing any such matching deployment units to the deploy(DeploymentUnit du) method of the deployer:
                 /**
                 * Deploy a deployment
                 *
                 * @param unit the unit
                 * @throws DeploymentException for any error
                 */
                 void deploy(DeploymentUnit unit) throws DeploymentException;



                • 5. Re: Injecting a classloader
                  alesj

                   

                  "jaikiran" wrote:
                  "david.lloyd@jboss.com" wrote:
                  do nested JARs which are just libraries qualify as deployment units?

                  No, they are not considered deployment units. Although i don't exactly know how such jars are represented or accessed from a deployment unit. Probably they end up as some kind of metadata? Ales?

                  Each nested jar in a jar is a sub-deployment.
                  Only jars in spec known locations are not considered as sub-deployments.
                  e.g. my.ear/lib/*.jar or my.war/WEB-INF/lib/*.jar

                  There might be more than one CL per app; e.g. ear with war.
                  It's the Module class that defines this.

                  Or what exactly are you looking for which DU::getClassLoader doesn't give you?

                  • 6. Re: Injecting a classloader
                    jaikiran

                     

                    "alesj" wrote:

                    Each nested jar in a jar is a sub-deployment.
                    Only jars in spec known locations are not considered as sub-deployments.
                    e.g. my.ear/lib/*.jar or my.war/WEB-INF/lib/*.jar

                    That's news to me. Thanks for clarifying :) By the way, where is this check/configuration done to see if the jar belongs to WEB-INF/lib or ear/lib?


                    • 7. Re: Injecting a classloader
                      alesj

                       

                      "jaikiran" wrote:
                      By the way, where is this check/configuration done to see if the jar belongs to WEB-INF/lib or ear/lib?

                      @ structure recognition phase.
                      e.g.
                      * WarStructure -> WEB-INF/lib
                      * EarStructure -> lib/


                      • 8. Re: Injecting a classloader
                        dmlloyd

                        Hmm, okay, it's starting to make sense. Essentially what I want is the ability for someone to put a jboss-logging.xml in their deployment unit somewhere, and if it contains a certain tag, then all that deployment unit's classloaders and children's classloaders will be registered with a callback that I specify somewhere.

                        It looks like I won't be able to use the simple BeanMetaDataFactory that I was using before to do this though - unless I can use "inject fromContext" somehow?

                        • 9. Re: Injecting a classloader
                          alesj

                           

                          "david.lloyd@jboss.com" wrote:
                          Hmm, okay, it's starting to make sense. Essentially what I want is the ability for someone to put a jboss-logging.xml in their deployment unit somewhere, and if it contains a certain tag, then all that deployment unit's classloaders and children's classloaders will be registered with a callback that I specify somewhere.

                          Perhaps you can make use of ModuleRegistry:
                          - http://anonsvn.jboss.org/repos/jbossas/projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/spi/dependency/ModuleRegistry.java
                          where we would do incallback on it in ClassLoading:
                          - http://anonsvn.jboss.org/repos/jbossas/projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/spi/dependency/ClassLoading.java
                          - http://anonsvn.jboss.org/repos/jbossas/branches/Branch_5_x/server/src/etc/conf/all/bootstrap/classloader.xml

                          "david.lloyd@jboss.com" wrote:

                          It looks like I won't be able to use the simple BeanMetaDataFactory that I was using before to do this though - unless I can use "inject fromContext" somehow?

                          Why wouldn't you be able to use "inject fromContext"?

                          But I still fail to see what exactly you're trying to do. :-)