I agree with Christian’s solution, and would add that the limitation of being 
exposed to at-most-one version of each type per bundle is a restriction of the 
underlying Java class loaders, not really OSGi at all.

Unless Java itself changes the way classes are loaded – highly unlikely since 
it would break lots of applications – then future versions of OSGi will all 
have the same restriction.

Regards,
Neil


> On 12 Aug 2015, at 16:23, Christian Schneider <ch...@die-schneider.net> wrote:
> 
> You can not simply import different versions of the same package into the 
> same bundle. Inside one classloader each class name must be unique.
> The classloaders are only involved when the object is created though.
> 
> So there is no problem to pass an A1.0.0 object into a method as Object. You 
> can then use reflection to work on the data.
> In the same way you can use reflection to create the new A2.0.0 class. If you 
> need a classloader that can access e.g. A2.0.0 but do not want to import it 
> directly
> you can search the bundle that offers the class and adapt the Bundle to 
> BundleWiring. From BundleWiring you can then get the classloader of the 
> bundle and use it
> to create the A2.0.0 class.
> 
> Additionally there is also the BundleRevision interface that allows you to 
> browse thorugh the exported packages if you do not know which bundle to use.
> I have recently used this scheme in karaf to allow to create classes on the 
> karaf shell without using dynamic imports on the command bundle.
> See 
> https://github.com/apache/karaf/commit/8f4ee1ff4370fcf8934364b7b104248ea914d08c
>  
> <https://github.com/apache/karaf/commit/8f4ee1ff4370fcf8934364b7b104248ea914d08c>
> 
> The method getBundleOfferingPackage returns the first bundle that offers any 
> version of the given package. This is a little simplistic of course as it 
> currently does not 
> allow to filter for versions but should show you how to do it.
> 
> Christian
> 
> Am 12.08.2015 um 08:50 schrieb Frank Langel:
>> Hello,
>> 
>> Allow a question 
>> 
>> Use Case : Data structure evolution
>> application evolves, class A evolves from 1.0.0 to 2.0.0
>> Need to do an update and retrieve all data by mapping from A(1.0.0) —> 
>> A(2.0.0)
>> How do I solve this use case
>> Does OSGI, perhaps in its latest version, allow for it ? 
>> I understand that in previous versions, it wasn’t supported  
>> <http://stackoverflow.com/questions/18722932/can-an-osgi-bundle-or-package-depend-on-multiple-versions-of-another-bundle-or-p>http://stackoverflow.com/questions/18722932/can-an-osgi-bundle-or-package-depend-on-multiple-versions-of-another-bundle-or-p
>>  
>> <http://stackoverflow.com/questions/18722932/can-an-osgi-bundle-or-package-depend-on-multiple-versions-of-another-bundle-or-p>
>> 
>> Current solution 
>> 
>> I could use a canonical model A(1.0.0) —> C — > A(2.0.0) , where I would 
>> import A1.0.0 in Bundle b1, and A2.0.0 in Bundle b2, and C into B1 and b2, 
>> and then map A1.0.0 -> C and C —> A2.0.0, but I was wondering if there is an 
>> easier way and allow a point to point mapping without using the canonical 
>> class.
>> 
>> I don’t think there is anything wrong with my current solution, but perhaps 
>> there is some functionality in the latest OSGI version that simplifies this? 
>> Thanks a lot
>> Frank
>> 
>> 
>> 
>> 
>> 
>> 
>> _______________________________________________
>> OSGi Developer Mail List
>> osgi-dev@mail.osgi.org <mailto:osgi-dev@mail.osgi.org>
>> https://mail.osgi.org/mailman/listinfo/osgi-dev 
>> <https://mail.osgi.org/mailman/listinfo/osgi-dev>
> _______________________________________________
> OSGi Developer Mail List
> osgi-dev@mail.osgi.org
> https://mail.osgi.org/mailman/listinfo/osgi-dev

_______________________________________________
OSGi Developer Mail List
osgi-dev@mail.osgi.org
https://mail.osgi.org/mailman/listinfo/osgi-dev

Reply via email to