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 <[email protected]> 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 <[email protected] 
> <mailto:[email protected]>> wrote:
>> 
>> 
>>> On 24 Apr 2023, at 14:23, Josiah Noel <[email protected] 
>>> <mailto:[email protected]>> 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

Reply via email to