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
