Thanks BJ and Ray, It's much clearer now!
Clement.
‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐
On Wednesday 11 March 2020 16:45, BJ Hargrave <hargr...@us.ibm.com> wrote:
> If multiple bundles export the identical package (that is, the same class
> files containing the same byte codes), the runtime classes are different and
> distinct. A Class object is a product of the class file and the class loader
> which loads it.
>
> So when bundle B (exporting its copy of package api.a) loads api.a.Service1
> and bundle C (exporting its copy of package api.a) loads api.a.Service1,
> those are two different classes as far as the JVM is concerned.
>
> Note, when a bundle both exports and imports a package, the framework is free
> to resolve the bundle in either state: exporting or importing. So when
> multiple bundles both export and import a given package, it is entirely
> possible the framework may choose that more then one of the bundles export
> the package. Ideally, we would want the framework to select only a single
> bundle to export the package and that all other bundles import the package.
> But there can be many reasons (such as other class space constraints) which
> may cause the framework to export the package from multiple bundles.
>
> I would recommend you have a API bundle which exports api.a which is usable
> at runtime and that all implementation bundles import api.a.
> --
>
> BJ Hargrave
> Senior Technical Staff Member, IBM // office: +1 386 848 1781
> OSGi Fellow and CTO of the OSGi Alliance // mobile: +1 386 848 3788
> hargr...@us.ibm.com
>
>> ----- Original message -----
>> From: "Clément Delgrange via osgi-dev" <osgi-dev@mail.osgi.org>
>> Sent by: osgi-dev-boun...@mail.osgi.org
>> To: OSGi Developer Mail List <osgi-dev@mail.osgi.org>
>> Cc:
>> Subject: [EXTERNAL] Re: [osgi-dev] Service binding issue and package wiring
>> Date: Wed, Mar 11, 2020 10:58
>>
>>> Since both bundles B and C offer to export the api.a package, the framework
>>> could resolve both bundles to each export the package. Thus you can end up
>>> with 2 exports of the api.a package in the framework. So bundle D will
>>> import api.a from either bundle B or bundle C and thus will not be able to
>>> see the service from the other bundle since it is not type compatible.
>>
>> Maybe I lack some basic knowledge about Java class loading, but I thought
>> that as the packages were at the same version there was nothing that can
>> really distinguish them, the framework will choose to use one of the
>> packages from a specific location (eg; Bundle B) and so the services could
>> not be impacted by a type compatibility issue. This is what I understand
>> from the blog post sent by Ray too: "Because the OSGi framework controls the
>> classloading on the package level, when multiple bundles export the API
>> package(s), the OSGi framework can decide which exporting bundle ultimately
>> provides the API package(s) to each bundle importing the API, that is, to
>> each API consumer.". But as I can factually see and from your explanation
>> things can happen differently?!
>>
>>> You may want to also look at
>>> https://blog.osgi.org/2020/01/to-embed-or-not-to-embed-your-api.html
>>
>> Thanks for the link. In the section Going Forward, it is wrote that we
>> should consider not embedding API packages that are defined by OSGi
>> specifications, does this advice also holds for our own service definitions?
>>
>> When building a system with multiple related features does it makes sens to
>> provide a compile time Bundle with all the API packages, and, one runtime
>> API Bundle for each API packages? Is it what the blog post is telling us?
>> What is the relation between osgi.cmpn and the set of osgi runtime API
>> bundles?
>>
>> I like to have one API bundle per workspace, it makes dependency management
>> easier and I have one unique project to be careful with. Would it be
>> relevant that bnd/bndtools provides a support to release multiple runtime
>> API Bundles from one API project simply by configuring something in the
>> bnd.bnd file. I am not sure to be clear, but this is to control the number
>> of projects needed.
>>
>> Another solution would be to make the API Bundle resolvable, but I had some
>> issue with that in the past...
>>
>> ‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐
>> On Wednesday 11 March 2020 14:19, Raymond Auge <raymond.a...@liferay.com>
>> wrote:
>>
>>> Hi Clément,
>>>
>>> You may want to also look at
>>> https://blog.osgi.org/2020/01/to-embed-or-not-to-embed-your-api.html
>>>
>>> :)
>>>
>>> - Ray
>>>
>>> On Wed, Mar 11, 2020 at 9:16 AM BJ Hargrave via osgi-dev
>>> <osgi-dev@mail.osgi.org> wrote:
>>>
>>>> Since both bundles B and C offer to export the api.a package, the
>>>> framework could resolve both bundles to each export the package. Thus you
>>>> can end up with 2 exports of the api.a package in the framework. So bundle
>>>> D will import api.a from either bundle B or bundle C and thus will not be
>>>> able to see the service from the other bundle since it is not type
>>>> compatible.
>>>>
>>>> In this scenario, it is better to have only a single exporter of api.a.
>>>> Bundle A would be the best choice here as it is the original source of the
>>>> package. But you would need to allow it to be resolvable so it can be used
>>>> at runtime.
>>>> --
>>>>
>>>> BJ Hargrave
>>>> Senior Technical Staff Member, IBM // office: +1 386 848 1781
>>>> OSGi Fellow and CTO of the OSGi Alliance // mobile: +1 386 848 3788
>>>> hargr...@us.ibm.com
>>>>
>>>>> ----- Original message -----
>>>>> From: "Clément Delgrange via osgi-dev" <osgi-dev@mail.osgi.org>
>>>>> Sent by: osgi-dev-boun...@mail.osgi.org
>>>>> To: OSGi Developer Mail List <osgi-dev@mail.osgi.org>
>>>>> Cc:
>>>>> Subject: [EXTERNAL] [osgi-dev] Service binding issue and package wiring
>>>>> Date: Wed, Mar 11, 2020 08:13
>>>>>
>>>>> Hi all,
>>>>>
>>>>> I have some sparse service binding issues at runtime that I think are
>>>>> related at how my bundles export packages.
>>>>>
>>>>> Here is what I have:
>>>>> - Bundle A exports API package api.a and is not resolvable (not present
>>>>> at runtime).
>>>>> - Bundle B provides api.a.Service1 service and export/import api.a
>>>>> package.
>>>>> - Bundle C provides api.a.Service2 service and export/import api.a
>>>>> package.
>>>>> - Bundle D consumes Service1 or Service2 and import api.a package.
>>>>>
>>>>> In this case is there any reason related to the way packages are wired
>>>>> that could lead bundle D to not get Service1 or Service2? Subsidiary
>>>>> question, is it fine to have an API package partly provided by two
>>>>> different bundles when provider bundles embed their API?
>>>>>
>>>>> In a more general practice, for a specific functionality, I have often
>>>>> one core service contract, some DTOs and some DAO services. Which one of
>>>>> this combination is better (considering that I have always an
>>>>> unresolvable API bundle and my providers export the API package they
>>>>> provide):
>>>>>
>>>>> - Core service, DAOs and DTOs in one API package then two providers, one
>>>>> for the core service implementation and DTOs and the other for the DAOs
>>>>> implementation.
>>>>> - Core service, DAOs and DTOs split in different API packages then three
>>>>> providers, one for each.
>>>>>
>>>>> Regards,
>>>>> Clement
>>>>> _______________________________________________
>>>>> 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
>>>
>>> --
>>> [Raymond Augé](http://www.liferay.com/web/raymond.auge/profile) (@rotty3000)
>>> Senior Software Architect [Liferay, Inc.](http://www.liferay.com) (@Liferay)
>>
>> _______________________________________________
>> 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