Inconsistency with service loading by layer or by class loader

Alan Bateman alan.bateman at oracle.com
Fri Dec 13 09:09:09 UTC 2024


On 12/12/2024 14:35, David Lloyd wrote:
> On Thu, Dec 12, 2024 at 7:27 AM Alan Bateman <alan.bateman at oracle.com> 
> wrote:
>
>     If ServiceLoader.load is invoked with a ClassLoader then it lazily
>     iterates through the class loader delegation chain. If
>     ServiceLoader.load is invoked with a ModuleLayer then it iterates
>     through the module layers. The former has deliberately limited
>     support for cases where a class loader is used by a module layer
>     but doing what you propose is adding more complexity for what
>     seems like a really niche usage. I would worry that changing it
>     along the lines you propose would result in something that only a
>     few people could understand.
>
>     Have you looked at changing these frameworks to work with modules
>     and specify a module layer to ServiceLoader.load?
>
>
> The problem is that 100% of these frameworks are required to work on 
> the class path as well (and some are not yet being tested on the 
> module path, or even defining an automatic module name, though I've 
> been working to improve that for a couple years now). So, we'd need 
> some kind of non-trivial fallback logic to try both the correct layer 
> (if any) or the correct class loader (since the unnamed module has no 
> layer). Also note that "correct" depends on the framework: some are 
> using the caller, some are using the TCCL, some are using their own 
> class loader, some are using a configured class loader, etc. It also 
> would likely involve deduplication of returned services along with 
> coping with ordering, which is sometimes significant. I think it's 
> unlikely that we would be able to settle on a preferred pattern for 
> this, and even more unlikely that we would be able to 
> successfully push these changes to *all* Jakarta, Microprofile, etc. 
> spec APIs in addition to non-spec APIs (even the ones that Red Hat 
> "controls" would probably give resistance unless the change was really 
> clean/simple).
>
This comes across as a soup of complexity. I can't help thinking it 
would be much simpler to use module layers as originally envisaged, 
meaning each configuration/layer layer is a graph of modules with a 
single parent. Whether the modules are mapped to a single class loader 
or different class loaders should just work. Existing code that uses 
ServiceLoader with a class loader would have a much better chance of 
working in that scenario.

-Alan
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/jigsaw-dev/attachments/20241213/d4859828/attachment-0001.htm>


More information about the jigsaw-dev mailing list