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