Neil, Thanks for your prompt reply. You were dead on! The bundle names generated by Maven are slightly different from the bundle names generated by Eclipse, so when I install a bundle from Eclipse, before I uninstall the 'original' Maven version, I end up in this situation.
I am using open(). Thanks again, Regards, Erwin On Jul 3, 2011, at 4:27 PM, Neil Bartlett wrote: > It sounds likely that you are picking up an incompatible service. > Check whether you open the ServiceTracker with "open(true)" or > "open(false)"... or just "open()", which is equivalent to > "open(false)". > > FYI the open(false)/open() variant is nearly always correct. > > To explain a little more... the service will only be compatible with > your bundle if both your bundle and the service publisher import the > service interface from the same place. Any of the following will work: > > a) You have an API bundle exporting the interface, and both the > service publisher and your consumer import it from that API bundle. > b) The service publisher has its own copy of the interface and exports > it; your consumer bundle imports it from the publisher. > c) Your consumer has its own copy of the interface and exports it; the > service publisher imports it from you (this way around is unusual, but > will still work). > > However if the publisher imports the interface from a different place > than your consumer, then the interfaces are different, even though > they have the same class names! Therefore you will naturally get > ClassCastExceptions. > > OSGi protects us from these incompatibilities, so long as we open our > service trackers with "open()/open(false)". If we say "open(true)" > then we are explicitly asking to be provided with incompatible service > instances, which is very rarely what we want. > > Rgds > Neil > > On Sun, Jul 3, 2011 at 9:08 PM, Erwin Hogeweg > <[email protected]> wrote: >> Hi, >> >> Apologies in advance if this is stupid beginners question. I have searched >> the web and consulted my "OSGIi in Action", but to no avail. >> >> I have a simple service bundle, and I want to track the availability of that >> service i another bundle. Sounds pretty basic. For some reason I get a >> reference to the implementation object instead of a ref to the interface >> when ServiceTrackerCustomizer.addingService() is called. No big deal, but >> when I try to cast that ref back to the interface a ClassCastException is >> thrown. >> >> I have a faint feeling that this has something to do with class loaders, but >> I cannot pinpoint the real issue. >> >> In the Activator of the service bundle: >> >> private MyService myService; // Interface for MyServiceImpl >> >> public final void start(BundleContext bundleContext) { >> context = bundleContext; >> >> myService = new MyServiceImpl(); >> context.registerService(MyService.class.getName(), myService, null); >> } >> Only the package with the MyService interface is exported. >> >> In the class that implements the ServiceTrackerCustomizer: >> >> public Object addingService(ServiceReference reference) { >> MyService myService = (MyService)context.getService(reference); // >> throws ClassCastException. reference is of type MyClassImpl >> ... >> } >> >> This bundle only imports the package with MyService. >> >> >> Thanks for your attention. >> >> Your help is greatly appreciated. >> >> Kind Regards, >> >> Erwin >> _______________________________________________ >> OSGi Developer Mail List >> [email protected] >> https://mail.osgi.org/mailman/listinfo/osgi-dev >> > > _______________________________________________ > OSGi Developer Mail List > [email protected] > https://mail.osgi.org/mailman/listinfo/osgi-dev _______________________________________________ OSGi Developer Mail List [email protected] https://mail.osgi.org/mailman/listinfo/osgi-dev
