Since layer A and layer B each have their own class loader, there is no
problem with each layer loading the same module.
Unfortunately, Guava is still not an explicit module
(https://github.com/google/guava/issues/2970). It is an automatic
module. This means it gets a "boost" in terms of the modules that it
reads. In fact, we think the implementation of module resolution is
giving it _too much_ of a boost, because Guava in layer B ends up
reading both Gson in layer B and Gson in layer A. Alan is investigating.
FWIW, Gson is an explicit module
(https://github.com/google/gson/blob/main/gson/src/main/java/module-info.java).
This is great for developers, and also saves this layer A+B scenario
from being even more complicated.
Alex
On 12/14/2023 3:58 PM, Anand Beh wrote:
Hi Pavel,
It seems to be the issue that you're loading the Gson jar twice -- once
in layer A and once in layer B. The problem is analogous to loading the
same jar file in different ClassLoaders (in fact, that's what is
happening behind the scenes). You'll get different Class instances,
which quickly turns into a debugging nightmare, a hellish classloading
situation which was one of the original motivations for JPMS.
If, by saying "moduleY can only be located in ONE layer," you mean that
moduleY must only be /loaded/ by one layer, then yes, I would say that
you are correct. However, in terms of usability, and this is what Alan
seems to be getting at, you can indeed have Gson be visible to multiple
layers at the same time.
Hope this helps.
Anand
On Thu, Dec 14, 2023 at 11:55 AM PavelTurk <[email protected]
<mailto:[email protected]>> wrote:
Hello, Alan
Thank you very much for your answer. I could reproduce this problem.
Please, see https://github.com/PavelTurk/jpms-test1
<https://github.com/PavelTurk/jpms-test1>
There is a detailed readme and only one class that throws
ResolutionException.
Best regards, Pavel
On 12/14/23 3:07 PM, Alan Bateman wrote:
> On 14/12/2023 10:56, PavelTurk wrote:
>> Hello all.
>>
>> Let's suppose that we have 4 layers:
>> 1) boot
>> 2) layerA (parent - boot)
>> 3) layerB (parent-boot)
>> 4) layerC (parents - layerA, layerB)
>>
>> Layers A,B,C were created using defineModulesWithOneLoader(...).
>>
>> And we have two modules - moduleX and moduleY. ModuleX uses moduleY.
>> ModuleX is located in layerC.
>>
>>
Do I understand correctly that moduleY can be located in any layer, but only
>>
in ONE layer? I mean, that it is impossible to place moduleY in any TWO
layers
>> at the same time - for example in boot layer and layerB.
>>
>> I am asking this because I read that it was possible but I tried
all variants and
>> always got ResolutionException: Module ModuleX reads more than
one module named
>> ModuleY.
>
> It's possible to have a module "X" n several module layers at the
same time.
>
> It's hard to diagnose things from the info in your mail. Can you
print the Configuration object for layer A, B and C and paste it
into a reply? There may be implied readability in the picture, or it
may be related to using a multi-parent Configuration, I can't tell.
Also when you say X uses Y then I assume you don't mean services,
instead you mean X requires Y, is that right?
>
> -Alan