You're hitting https://issues.apache.org/jira/browse/FELIX-1131, for which
I've just provided a patch.  Feel free to test it and report.


2013/6/18 Charles Moulliard <[email protected]>

> Hi,
>
> I would like to deploy on OSGI platform (Karaf) two different versions
> (but could be more) of an OSGI service (org.acme.common.HelloWorldService -
> v1 & v2). For that purpose I have created 2 Blueprint XML config files,
> packaged the bundles and deploy them on karaf
>
> [  57] [Active     ] [Created     ] [   80] Acme :: OSGI :: Client (1.0.0)
> [  60] [Active     ] [Created     ] [   80] Acme :: OSGI :: Commons :: v1
> (1.0.0)
>
> Here is an example of blueprint config for Commons V1
>
> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
> <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0";
>            xmlns:cm="
> http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0";>
>
>   <cm:property-placeholder id="property-placeholder"
>                            persistent-id="config.v1"/>
>
>   <bean id="helloWorldService"
> class="org.acme.common.HelloWorldServiceImpl"
>         init-method="init" destroy-method="destroy">
>     <property name="version" value="${version}"/>
>   </bean>
>
>   <service ref="helloWorldService"
>            interface="org.acme.common.HelloWorldService"
>            ranking="100">
>     <service-properties>
>       <entry key="version" value="v1"/>
>     </service-properties>
>   </service>
>
> </blueprint>
>
> Now, a bundle, which is a client of a service will consume it.
>
> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
> <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0";>
>
>   <bean id="helloWorldClient" class="org.acme.client.HelloWorldClient"
>         init-method="callService">
>     <property name="service" ref="helloWorldService"/>
>   </bean>
>
>   <reference id="helloWorldService"
>              interface="org.acme.common.HelloWorldService"
>              filter="(version=v1)"/>
>
> </blueprint>
>
> That works fine.
>
> If now, I would like, that the client uses the latest version of the
> service v2 (and not v1) when we have 2 OSGI Services deployed on OSGI
> Registry, I must specifically specified that it must import the package
> "org.acme.common;version=2.0".
> But when I use a version range to let the bundle to take the latest
> version available, then I get this error
>
> [  57] [Active     ] [Failure     ] [   80] Acme :: OSGI :: Client (1.0.0)
> [  60] [Active     ] [Created     ] [   80] Acme :: OSGI :: Commons :: v1
> (1.0.0)
> [  61] [Active     ] [Created     ] [   80] Acme :: OSGI :: Commons :: v2
> (2.0.0)
>
> Caused by: java.lang.ClassCastException:
> org.acme.common.HelloWorldServiceImpl cannot be cast to
> org.acme.common.HelloWorldService
> at Proxy93f66d24_52d9_49b4_9d6c_8c65ce3ef1f1.callService(Unknown Source)
>  at org.acme.client.HelloWorldClient.callService(HelloWorldClient.java:14)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)[:1.6.0_45]
>
> Remark : Doing a refresh of the bundle client does not allow the bundle to
> load the latest package version available.
>
> karaf@root> packages:exports 60
>     ID Packages
>     60 org.acme.common; version=1.0.0
> karaf@root> packages:exports 61
>     ID Packages
>     61 org.acme.common; version=2.0.0
>
> karaf@root> packages:imports 57
> Acme :: OSGI :: Commons :: v1 (60): org.acme.common; version=1.0.0
>
> Is there a workaround to allow a bundle which is a client of an OSGI
> Service (= Proxy object) to use the bundle containing the latest package
> version deployed ?
>
> Regards,
>
> --
> Charles Moulliard
> Apache Committer / Architect @RedHat
> Twitter : @cmoulliard | Blog : http://cmoulliard.blogspot.com
>
>

Reply via email to