Uploaded image for project: 'WildFly'
  1. WildFly
  2. WFLY-3511

Invalid class load of embedded interface despite defined dependency

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Obsolete
    • Icon: Major Major
    • None
    • 8.1.0.Final
    • Class Loading
    • None

      It is common that OSGi jars contain the interfaces of the services they implement. The wildfly modules hierarchy contains an implementation bundle for the HttpService with a dependency on org.osgi.enterprise which contains the org.osgi.service.http.HttpService interface. Client modules are expected to define a dependency on org.osgi.enterprise

      I would expect that org.osgi.service.http.HttpService is always loaded from org.osgi.enterprise and never from the impl bundle that also contains this interface.

      Module org.jboss.gravia contains the impl of the HttpService and a dependency on org.osgi.enterprise

      <module xmlns="urn:jboss:module:1.1" name="org.jboss.gravia">
          <properties>
              <property name="jboss.api" value="private"/>
          </properties>
      
          <resources>
              <resource-root path="gravia-provision-1.1.0.Beta30.jar"/>
              <resource-root path="gravia-repository-1.1.0.Beta30.jar"/>
              <resource-root path="gravia-resolver-1.1.0.Beta30.jar"/>
              <resource-root path="gravia-resource-1.1.0.Beta30.jar"/>
              <resource-root path="gravia-runtime-api-1.1.0.Beta30.jar"/>
              <resource-root path="gravia-runtime-embedded-1.1.0.Beta30.jar"/>
              <resource-root path="org.apache.felix.configadmin-1.8.0.jar"/>
              <resource-root path="org.apache.felix.http.bridge-2.2.1.jar"/>
              <resource-root path="org.apache.felix.log-1.0.1.jar"/>
              <resource-root path="org.apache.felix.metatype-1.0.8.jar"/>
              <resource-root path="org.apache.felix.scr-1.6.2.jar"/>
          </resources>
      
          <exports>
              <include path="org/jboss/gravia/process"/>
              <include path="org/jboss/gravia/provision"/>
              <include path="org/jboss/gravia/resource"/>
              <include path="org/jboss/gravia/resolver"/>
              <include path="org/jboss/gravia/repository"/>
              <include path="org/jboss/gravia/runtime"/>
          </exports>
          
          <dependencies>
              <module name="javax.api"/>
              <module name="javax.servlet.api"/>
              <module name="org.osgi.core"/>
              <module name="org.osgi.enterprise"/>
              <module name="org.slf4j"/>
          </dependencies>
      </module>
      

      When I use this code in a webapp

                  ModuleClassLoader classLoader = (ModuleClassLoader) getClass().getClassLoader();
                  org.jboss.modules.Module graviaModule = loadModule(ModuleIdentifier.create("org.jboss.gravia"));
                  org.jboss.modules.Module osgiModule = loadModule(ModuleIdentifier.create("org.osgi.enterprise"));
                  Class<?> interfClass = loadClass(null, osgiModule.getClassLoader(), "org.osgi.service.http.HttpService");
                  Class<?> implClass = loadClass(null, graviaModule.getClassLoader(), "org.apache.felix.http.base.internal.service.HttpServiceImpl");
                  if (!interfClass.isAssignableFrom(implClass)) {
                      System.out.println("NOT ASSIGNABLE: " + interfClass + " <= " + implClass);
                  }
      

      I get

      10:47:13,264 INFO  [stdout] (MSC service thread 1-7) LOADED: interface org.osgi.service.http.HttpService
      10:47:13,265 INFO  [stdout] (MSC service thread 1-7)    using null from ModuleClassLoader for Module "org.osgi.enterprise:main" from local module loader @10fdc382 (finder: local module finder @42e9485 (roots: /Users/tdiesler/git/fabric8poc/itests/smoke/wildfly/target/wildfly-8.1.0.Final/modules,/Users/tdiesler/git/fabric8poc/itests/smoke/wildfly/target/wildfly-8.1.0.Final/modules/system/layers/base))
      10:47:13,266 INFO  [stdout] (MSC service thread 1-7)    loaded from => ModuleClassLoader for Module "org.osgi.enterprise:main" from local module loader @10fdc382 (finder: local module finder @42e9485 (roots: /Users/tdiesler/git/fabric8poc/itests/smoke/wildfly/target/wildfly-8.1.0.Final/modules,/Users/tdiesler/git/fabric8poc/itests/smoke/wildfly/target/wildfly-8.1.0.Final/modules/system/layers/base))
      10:47:13,268 INFO  [stdout] (MSC service thread 1-7) LOADED: class org.apache.felix.http.base.internal.service.HttpServiceImpl
      10:47:13,268 INFO  [stdout] (MSC service thread 1-7)    using null from ModuleClassLoader for Module "org.jboss.gravia:main" from local module loader @10fdc382 (finder: local module finder @42e9485 (roots: /Users/tdiesler/git/fabric8poc/itests/smoke/wildfly/target/wildfly-8.1.0.Final/modules,/Users/tdiesler/git/fabric8poc/itests/smoke/wildfly/target/wildfly-8.1.0.Final/modules/system/layers/base))
      10:47:13,268 INFO  [stdout] (MSC service thread 1-7)    loaded from => ModuleClassLoader for Module "org.jboss.gravia:main" from local module loader @10fdc382 (finder: local module finder @42e9485 (roots: /Users/tdiesler/git/fabric8poc/itests/smoke/wildfly/target/wildfly-8.1.0.Final/modules,/Users/tdiesler/git/fabric8poc/itests/smoke/wildfly/target/wildfly-8.1.0.Final/modules/system/layers/base))
      10:47:13,269 INFO  [stdout] (MSC service thread 1-7) NOT ASSIGNABLE: interface org.osgi.service.http.HttpService <= class org.apache.felix.http.base.internal.service.HttpServiceImpl
      

      The resulting application error is

      10:47:13,503 WARN  [org.jboss.gravia.runtime] (MSC service thread 1-7) Error while firing service event REGISTERED for: ServiceState{service.id=54, objectClass=[org.osgi.service.http.HttpService, org.apache.felix.http.api.ExtHttpService]}: java.lang.ClassCastException: org.apache.felix.http.base.internal.service.HttpServiceImpl cannot be cast to org.osgi.service.http.HttpService
      	at org.jolokia.osgi.JolokiaActivator$HttpServiceCustomizer.addingService(JolokiaActivator.java:207)
      	at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:932) [org.osgi.core-5.0.0.jar:]
      	at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:864) [org.osgi.core-5.0.0.jar:]
      	at org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:256) [org.osgi.core-5.0.0.jar:]
      	at org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:229) [org.osgi.core-5.0.0.jar:]
      	at org.osgi.util.tracker.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:894) [org.osgi.core-5.0.0.jar:]
      	at org.jboss.gravia.runtime.embedded.spi.BundleContextAdaptor$ServiceListenerAdaptor.serviceChanged(BundleContextAdaptor.java:323) [gravia-runtime-embedded-1.1.0.Beta30.jar:]
      

              dlloyd@redhat.com David Lloyd
              tdiesler@redhat.com Thomas Diesler
              Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

                Created:
                Updated:
                Resolved: