Hi Bram, If you use the right classloader with ServiceLoader.load(class, classLoader) you shouldn't really need SPI Fly at all. The classloader that you pass in to it should be the classloader of the bundle that hosts the service implementation (not the service API). You can get that classloader by calling: bundle.adapt(BundleWiring.class).getClassLoader()
Hope this helps, David On 9 October 2013 09:40, Bram Gadeyne <[email protected]> wrote: > Hi, > > Should SPI-fly also work when a bundle uses the ServiceLoader.load(class, > class.getClassLoader) function? > > Specifically I'm trying to convert org.openrdf to an osgi bundle. > > A bundle org.openrdf.query.parser looks for implementations of > org.openrdf.query.parser.QueryParserFactory. I've added the > Require-Capability and osgi.serviceloader... and osgi.extender... to the > Manifest. This class is actually an extention of the abstract class > ServiceRegistry from another package so I also added the Require-Capability > to this bundles Manifest. > > The abstract class is available via this url > https://bitbucket.org/openrdf/sesame/src/c2c4cfa901461812e15b697994a439efbadaa9e0/core/util/src/main/java/info/aduna/lang/service/ServiceRegistry.java?at=2.7.x > > At line 46 in this file You'll find: > java.util.ServiceLoader.load(serviceClass, serviceClass.getClassLoader()); > > The bundle that exports the service is org.openrdf.query.parser.sparql. Here > I've added the Require-Capability and Provide Capability clauses. > > When I run the application and enter "inspect capability service 34" I can > see the serviceloader.mediator property. > > However it seems like the consumer can't find the service. Therefore I > thought the ServiceLoader.load(class, class.getClassLoader) is causing a > problem since the abstract class and implementing class are in a different > bundle. > > > Kind regards > > -- > Bram Gadeyne > Department of Information Technology > Internet Based Communication Networks and Services (IBCN) > Ghent University - iMinds > Gaston Crommenlaan 8 (Bus 201), B-9050 Gent, Belgium > T: +32 (0)9 33 20497 > T Secr: +32 (0)9 33 14900 > F: +32 (0)9 33 14899 > E: [email protected] > W : www.ibcn.intec.UGent.be >
