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

Reply via email to