4 Replies Latest reply on May 10, 2010 10:18 AM by warjort

    DynamicImport-Package takes presendence over embedded classes

    thomas.diesler

      The symptom is that we see WARN messages like this

       

      09:04:13,595 WARN  [BaseDelegateLoader] Not getting package org.osgi.service.log from policy that has no classLoader: LazyFilteredDelegateLoader@a75737{factory=org.jboss.classloading.spi.dependency.policy.DynamicClassLoaderPolicyFactory@4f0853 filter=<EVERYTHING>}
      09:04:13,599 WARN  [BaseDelegateLoader] Not getting package org.osgi.service.log from policy that has no classLoader: LazyFilteredDelegateLoader@a75737{factory=org.jboss.classloading.spi.dependency.policy.DynamicClassLoaderPolicyFactory@4f0853 filter=<EVERYTHING>}
      09:04:13,727 WARN  [BaseDelegateLoader] Not getting package org.osgi.util.tracker from policy that has no classLoader: LazyFilteredDelegateLoader@a75737{factory=org.jboss.classloading.spi.dependency.policy.DynamicClassLoaderPolicyFactory@4f0853 filter=<EVERYTHING>}

       

      The reason seems that the BaseClassLoaderDomain uses this sematics in getPackage

       

      1. // Try the before attempt
      2. // Next we try the old "big ball of mud" model
      3. // Next we try the imports  
      4. // Finally use any requesting classloader
      5. // Try the after attempt

       

      In step #3 the imports also include the dynamic imports (even the EVERYTHING aka '*' imports)

      The  LazyFilteredDelegateLoader has no classloader associated and getPackage fails.

       

      In OSGi dynamic imports are considered after the bundles embedded classpath.

       

      I suggest we split getPackageFromImports in two variants and consider dynamic import between step #4 and #5

        • 1. Re: Cannot load package from deployment that has dynamic imports
          thomas.diesler

          A trace log is here

           

          2010-05-04 09:04:13,584 TRACE [org.jboss.classloader.spi.base.BaseClassLoader] OSGiBundleClassLoader@1443800{org.apache.felix.log-1.0.0} loadClass org.osgi.service.log.LogEntry resolve=false
          2010-05-04 09:04:13,584 TRACE [org.jboss.classloader.spi.base.BaseClassLoader] OSGiBundleClassLoader@1443800{org.apache.felix.log-1.0.0} aquireLockFairly Thread[Thread-2,5,main]
          2010-05-04 09:04:13,584 TRACE [org.jboss.classloader.spi.base.BaseClassLoader] OSGiBundleClassLoader@1443800{org.apache.felix.log-1.0.0} aquiredLock Thread[Thread-2,5,main] holding=1
          2010-05-04 09:04:13,585 TRACE [org.jboss.classloader.spi.base.BaseClassLoader] OSGiBundleClassLoader@1443800{org.apache.felix.log-1.0.0} load from domain org.osgi.service.log.LogEntry domain=OSGiClassLoaderDomain@174a6e2{OSGiClassLoaderDomain}
          2010-05-04 09:04:13,585 TRACE [org.jboss.classloader.spi.base.BaseClassLoaderDomain] OSGiClassLoaderDomain@174a6e2{OSGiClassLoaderDomain} findLoader org/osgi/service/log/LogEntry.class classLoader=OSGiBundleClassLoader@1443800{org.apache.felix.log-1.0.0} allExports=false findInParent=true
          2010-05-04 09:04:13,585 TRACE [org.jboss.classloader.spi.ClassLoaderDomain] OSGiClassLoaderDomain@174a6e2{OSGiClassLoaderDomain} org/osgi/service/log/LogEntry.class matches parent beforeFilter=<EVERYTHING>
          2010-05-04 09:04:13,585 TRACE [org.jboss.classloader.spi.ClassLoaderDomain] OSGiClassLoaderDomain@174a6e2{OSGiClassLoaderDomain} load from parent org/osgi/service/log/LogEntry.class parent=ClassLoaderDomain@cb07ef{DefaultDomain}
          2010-05-04 09:04:13,585 TRACE [org.jboss.classloader.spi.base.BaseClassLoaderDomain] ClassLoaderDomain@cb07ef{DefaultDomain} findLoader org/osgi/service/log/LogEntry.class classLoader=null allExports=true findInParent=true
          2010-05-04 09:04:13,586 TRACE [org.jboss.classloader.spi.ClassLoaderDomain] ClassLoaderDomain@cb07ef{DefaultDomain} org/osgi/service/log/LogEntry.class does NOT match parent beforeFilter=[java], OSGI_CORE, [org.osgi.framework, org.osgi.framework.hooks, org.osgi.framework.hooks.service, org.osgi.framework.launch, org.osgi.service.condpermadmin, org.osgi.service.packageadmin, org.osgi.service.permissionadmin, org.osgi.service.startlevel, org.osgi.service.url, com.sun.xml.internal.bind.v2, javax.imageio, javax.imageio.stream, javax.management, javax.management.loading, javax.management.modelmbean, javax.management.monitor, javax.management.openmbean, javax.management.relation, javax.management.remote, javax.management.remote.rmi, javax.management.timer, javax.naming, javax.naming.event, javax.naming.spi, javax.net, javax.net.ssl, javax.security.cert, javax.xml.datatype, javax.xml.namespace, javax.xml.parsers, javax.xml.transform, javax.xml.transform.dom, javax.xml.transform.sax, javax.xml.transform.stream, javax.xml.validation, org.apache.log4j, org.jboss.beans.metadata.plugins.builder, org.jboss.beans.metadata.plugins, org.jboss.beans.metadata.spi.builder, org.jboss.beans.metadata.spi, org.jboss.dependency.spi, org.jboss.kernel.spi.dependency, org.jboss.logging, org.jboss.osgi.deployment.deployer, org.jboss.osgi.deployment.interceptor, org.jboss.osgi.spi.capability, org.jboss.osgi.spi.framework, org.jboss.osgi.spi.service, org.jboss.osgi.spi.util, org.jboss.osgi.spi, org.jboss.osgi.testing, org.jboss.osgi.vfs, org.jboss.vfs, org.w3c.dom, org.w3c.dom.bootstrap, org.w3c.dom.events, org.w3c.dom.ls, org.w3c.dom.ranges, org.w3c.dom.traversal, org.w3c.dom.views, org.xml.sax, org.xml.sax.ext, org.xml.sax.helpers]
          2010-05-04 09:04:13,586 TRACE [org.jboss.classloader.spi.base.BaseClassLoaderDomain] ClassLoaderDomain@cb07ef{DefaultDomain} trying to load org/osgi/service/log/LogEntry.class from all exports of package org.osgi.service.log null
          2010-05-04 09:04:13,586 TRACE [org.jboss.classloader.spi.ClassLoaderDomain] ClassLoaderDomain@cb07ef{DefaultDomain} org/osgi/service/log/LogEntry.class does NOT match parent afterFilter=<NOTHING>
          2010-05-04 09:04:13,586 TRACE [org.jboss.classloader.spi.base.BaseClassLoaderDomain] OSGiClassLoaderDomain@174a6e2{OSGiClassLoaderDomain} not loading org/osgi/service/log/LogEntry.class from all exports
          2010-05-04 09:04:13,587 TRACE [org.jboss.classloader.spi.base.BaseClassLoaderDomain] OSGiClassLoaderDomain@174a6e2{OSGiClassLoaderDomain} trying to load org/osgi/service/log/LogEntry.class from import FilteredDelegateLoader@11ff451{delegate=OSGiClassLoaderPolicy@553763{osgi.cmpn-4.2.0.200908310645}} for OSGiBundleClassLoader@1443800{org.apache.felix.log-1.0.0}
          2010-05-04 09:04:13,587 TRACE [org.jboss.classloader.spi.filter.FilteredDelegateLoader] FilteredDelegateLoader@11ff451{delegate=OSGiClassLoaderPolicy@553763{osgi.cmpn-4.2.0.200908310645}} org/osgi/service/log/LogEntry.class matches resource filter=[org.osgi.service.log]
          2010-05-04 09:04:13,588 TRACE [org.jboss.classloader.spi.base.BaseClassLoader] OSGiBundleClassLoader@1c79dfc{osgi.cmpn-4.2.0.200908310645} get resource locally org/osgi/service/log/LogEntry.class
          2010-05-04 09:04:13,588 TRACE [org.jboss.classloader.spi.base.BaseClassLoader] OSGiBundleClassLoader@1c79dfc{osgi.cmpn-4.2.0.200908310645} got resource locally org/osgi/service/log/LogEntry.class
          2010-05-04 09:04:13,588 TRACE [org.jboss.classloader.spi.base.BaseClassLoader] OSGiBundleClassLoader@1c79dfc{osgi.cmpn-4.2.0.200908310645} attemptLock Thread[Thread-2,5,main]
          2010-05-04 09:04:13,589 TRACE [org.jboss.classloader.spi.base.BaseClassLoader] OSGiBundleClassLoader@1c79dfc{osgi.cmpn-4.2.0.200908310645} locked Thread[Thread-2,5,main] holding=1
          2010-05-04 09:04:13,589 TRACE [org.jboss.classloader.spi.filter.FilteredDelegateLoader] FilteredDelegateLoader@11ff451{delegate=OSGiClassLoaderPolicy@553763{osgi.cmpn-4.2.0.200908310645}} org.osgi.service.log.LogEntry matches class filter=[org.osgi.service.log]
          2010-05-04 09:04:13,589 TRACE [org.jboss.classloader.spi.base.BaseClassLoader] OSGiBundleClassLoader@1c79dfc{osgi.cmpn-4.2.0.200908310645} load class locally org.osgi.service.log.LogEntry
          2010-05-04 09:04:13,592 TRACE [org.jboss.classloader.spi.base.BaseClassLoader] OSGiBundleClassLoader@1c79dfc{osgi.cmpn-4.2.0.200908310645} getPackage org.osgi.service.log
          2010-05-04 09:04:13,593 TRACE [org.jboss.classloader.spi.base.BaseClassLoader] OSGiBundleClassLoader@1c79dfc{osgi.cmpn-4.2.0.200908310645} getPackage org.osgi.service.log domain=OSGiClassLoaderDomain@174a6e2{OSGiClassLoaderDomain}
          2010-05-04 09:04:13,593 TRACE [org.jboss.classloader.spi.ClassLoaderDomain] OSGiClassLoaderDomain@174a6e2{OSGiClassLoaderDomain} org.osgi.service.log matches parent beforeFilter=<EVERYTHING>
          2010-05-04 09:04:13,593 TRACE [org.jboss.classloader.spi.ClassLoaderDomain] OSGiClassLoaderDomain@174a6e2{OSGiClassLoaderDomain} get package from parent org.osgi.service.log parent=ClassLoaderDomain@cb07ef{DefaultDomain}
          2010-05-04 09:04:13,594 TRACE [org.jboss.classloader.spi.ClassLoaderDomain] ClassLoaderDomain@cb07ef{DefaultDomain} org.osgi.service.log does NOT match parent beforeFilter=[java], OSGI_CORE, [org.osgi.framework, org.osgi.framework.hooks, org.osgi.framework.hooks.service, org.osgi.framework.launch, org.osgi.service.condpermadmin, org.osgi.service.packageadmin, org.osgi.service.permissionadmin, org.osgi.service.startlevel, org.osgi.service.url, com.sun.xml.internal.bind.v2, javax.imageio, javax.imageio.stream, javax.management, javax.management.loading, javax.management.modelmbean, javax.management.monitor, javax.management.openmbean, javax.management.relation, javax.management.remote, javax.management.remote.rmi, javax.management.timer, javax.naming, javax.naming.event, javax.naming.spi, javax.net, javax.net.ssl, javax.security.cert, javax.xml.datatype, javax.xml.namespace, javax.xml.parsers, javax.xml.transform, javax.xml.transform.dom, javax.xml.transform.sax, javax.xml.transform.stream, javax.xml.validation, org.apache.log4j, org.jboss.beans.metadata.plugins.builder, org.jboss.beans.metadata.plugins, org.jboss.beans.metadata.spi.builder, org.jboss.beans.metadata.spi, org.jboss.dependency.spi, org.jboss.kernel.spi.dependency, org.jboss.logging, org.jboss.osgi.deployment.deployer, org.jboss.osgi.deployment.interceptor, org.jboss.osgi.spi.capability, org.jboss.osgi.spi.framework, org.jboss.osgi.spi.service, org.jboss.osgi.spi.util, org.jboss.osgi.spi, org.jboss.osgi.testing, org.jboss.osgi.vfs, org.jboss.vfs, org.w3c.dom, org.w3c.dom.bootstrap, org.w3c.dom.events, org.w3c.dom.ls, org.w3c.dom.ranges, org.w3c.dom.traversal, org.w3c.dom.views, org.xml.sax, org.xml.sax.ext, org.xml.sax.helpers]
          2010-05-04 09:04:13,594 TRACE [org.jboss.classloader.spi.base.BaseClassLoaderDomain] ClassLoaderDomain@cb07ef{DefaultDomain} trying to get package org.osgi.service.log from all exports null
          2010-05-04 09:04:13,594 TRACE [org.jboss.classloader.spi.ClassLoaderDomain] ClassLoaderDomain@cb07ef{DefaultDomain} org.osgi.service.log does NOT match parent afterFilter=<NOTHING>
          2010-05-04 09:04:13,594 TRACE [org.jboss.classloader.spi.ClassLoaderDomain] OSGiClassLoaderDomain@174a6e2{OSGiClassLoaderDomain} package not found in parent org.osgi.service.log parent=ClassLoaderDomain@cb07ef{DefaultDomain}
          2010-05-04 09:04:13,594 TRACE [org.jboss.classloader.spi.base.BaseClassLoaderDomain] OSGiClassLoaderDomain@174a6e2{OSGiClassLoaderDomain} not getting package org.osgi.service.log from all exports
          2010-05-04 09:04:13,595 TRACE [org.jboss.classloader.spi.base.BaseClassLoaderDomain] OSGiClassLoaderDomain@174a6e2{OSGiClassLoaderDomain} trying to get package org.osgi.service.log from imports [LazyFilteredDelegateLoader@a75737{factory=org.jboss.classloading.spi.dependency.policy.DynamicClassLoaderPolicyFactory@4f0853}] for OSGiBundleClassLoader@1c79dfc{osgi.cmpn-4.2.0.200908310645}
          2010-05-04 09:04:13,595 TRACE [org.jboss.classloader.spi.filter.FilteredDelegateLoader] LazyFilteredDelegateLoader@a75737{factory=org.jboss.classloading.spi.dependency.policy.DynamicClassLoaderPolicyFactory@4f0853} org.osgi.service.log matches package filter=<EVERYTHING>
          2010-05-04 09:04:13,595 TRACE [org.jboss.classloader.spi.base.BaseDelegateLoader] Factory did not create a delegate: org.jboss.classloading.spi.dependency.policy.DynamicClassLoaderPolicyFactory@4f0853
          2010-05-04 09:04:13,595 WARN  [org.jboss.classloader.spi.base.BaseDelegateLoader] Not getting package org.osgi.service.log from policy that has no classLoader: LazyFilteredDelegateLoader@a75737{factory=org.jboss.classloading.spi.dependency.policy.DynamicClassLoaderPolicyFactory@4f0853 filter=<EVERYTHING>}
          2010-05-04 09:04:13,596 TRACE [org.jboss.classloader.spi.base.BaseClassLoaderDomain] OSGiClassLoaderDomain@174a6e2{OSGiClassLoaderDomain} trying to get package org.osgi.service.log from requesting OSGiBundleClassLoader@1c79dfc{osgi.cmpn-4.2.0.200908310645}
          2010-05-04 09:04:13,596 TRACE [org.jboss.classloader.spi.ClassLoaderDomain] OSGiClassLoaderDomain@174a6e2{OSGiClassLoaderDomain} org.osgi.service.log does NOT match parent afterFilter=<NOTHING>
          2010-05-04 09:04:13,596 TRACE [org.jboss.classloader.spi.base.BaseClassLoader] OSGiBundleClassLoader@1c79dfc{osgi.cmpn-4.2.0.200908310645} package not found org.osgi.service.log
          
          

           

          The class itself seems to load fine

          • 2. Re: Cannot load package from deployment that has dynamic imports
            thomas.diesler
            • 3. Re: DynamicImport-Package takes presendence over embedded classes
              alesj
              In step #3 the imports also include the dynamic imports (even the EVERYTHING aka '*' imports)

              The  LazyFilteredDelegateLoader has no classloader associated and getPackage fails.

              Why doesn't LFDL have classloader associated?

               

              Looking at DynamicClassLoaderPolicyFactory, the only reason it cannot

              be there is that dependent module's deployment is still in pre-CL stage.

               

              Is this valid? Or do we need to enforce this?

              In OSGi dynamic imports are considered after the bundles embedded classpath.

               

              I suggest we split getPackageFromImports in two variants and consider dynamic import between step #4 and #5

              This looks like it would solve the problem.

              Where in the spec is this defined?

              • 4. Re: DynamicImport-Package takes presendence over embedded classes
                warjort

                Ales Justin wrote:

                In OSGi dynamic imports are considered after the bundles embedded classpath.

                 

                I suggest we split getPackageFromImports in two variants and consider dynamic import between step #4 and #5

                This looks like it would solve the problem.

                Where in the spec is this defined?

                You can't just change it. Moving the order of dynamic imports would break previously working configurations.

                Instead you should introduce a flag that defines "import before" and "import after" behaviour.

                OSGi dynamic imports could then be flagged as "import after" by default.

                 

                The changes should be something like:

                 

                1) Add a flag to the Requirements that specifies whether it is a before/after import (this would need a mixin interface

                with assumption of import before if it doesn't implement it - AbstractRequirement would).

                2) Introduce an "import after" list of imports to the ClassLoaderPolicy

                3) Change the Module construction of ClassLoaderPolicys to construct the delegates in the correct list of imports

                according to the new flag

                4) Change the BaseClassLoaderDomain to use the two different import lists in the correct place.