[External] : Re: provides and requires static ... runtime error
Michał Kłeczek
michal at kleczek.org
Tue Apr 25 06:41:42 UTC 2023
As specified in https://help.intrexx.com/apidocs/jdk17/api/java.base/java/lang/module/Configuration.html#resolveAndBind(java.lang.module.ModuleFinder,java.util.List,java.lang.module.ModuleFinder,java.util.Collection)
all modules reachable by a ModuleFinder are examined for uses-provides relationship and added to the set of resolved modules.
It gives you the optionality: just add/remove artefacts to/from the module path to add/remove service providers.
> On 25 Apr 2023, at 03:39, Rob Bygrave <robin.bygrave at gmail.com> wrote:
>
> > only y and y.inject must be in two separate JARs.
>
> Does this work without any module having a `requires y.inject`? If so, how is the y.inject module get included without a `requires y.inject` being specified? (There is an obvious follow up question if that is the case as it likely breaks the case where only y module is used).
>
>
> Cheers, Rob.
>
> On Tue, 25 Apr 2023 at 01:32, Ron Pressler <ron.pressler at oracle.com <mailto:ron.pressler at oracle.com>> wrote:
>>
>>
>>> On 24 Apr 2023, at 14:23, Josiah Noel <josiahnoel at gmail.com <mailto:josiahnoel at gmail.com>> wrote:
>>>
>>>
>>>> I’m confused. To use the implementation of the `x.Plugin` service (defined in X) that you want Y to `provides` an implementation of, some module *must* have a `uses x.Plugin`. The runtime has to know that that service is needed by the program. Maybe the application `uses` it, but X itself could also declare that it `uses` an implementation of a service interface that it, itself, declares. So perhaps it is X that `uses X.plugin`, but someone has to actually say they want to use the service.
>>>
>>> I believe I'm picking up what you're putting down, but let's review it again to be sure.
>>>
>>>
>>> In artifact X we have:
>>>
>>>>
>>>> exports x.spi;
>>>> uses x.spi.Plugin;
>>>
>>> in artifact Y we have two modules: y and y.inject.
>>>
>>>> exports y.stuff;
>>>
>>>
>>> And
>>>> requires x;
>>>> provides x.spi.Plugin with y.inject.PluginImpl;
>>>
>>> With this in mind, we have two situations we want to support. we have an application Z that wants to use the Y artifact alone and a case where Z wants to use X and Y.
>>>
>>> With Y alone, the z module should look like this correct?
>>>
>>>> requires y;
>>>
>>> And in the case where Z wants both X and Y (with X doing the service-loading), we do:
>>>
>>>> requires x;
>>>> requires y;
>>>
>>> Am I right to understand that X will service load the y.inject plugin correctly?
>>
>> Yes.
>> This is also how it works today, only y and y.inject must be in two separate JARs.
>>
>> — Ron
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/jigsaw-dev/attachments/20230425/82675602/attachment.htm>
More information about the jigsaw-dev
mailing list