Inconsistency with service loading by layer or by class loader
Alan Bateman
alan.bateman at oracle.com
Sun Dec 15 07:22:00 UTC 2024
On 13/12/2024 23:57, David Lloyd wrote:
> :
>
> Another behavioral quirk is that service loaders don't actually work
> the same if the service was found in a named module. If a service
> provider class was found in a named module, then the loader will also
> look for a `provider` static method which can return the service
> instance, whereas services found via the classic mechanism will only
> invoke the constructor of the service class to acquire its instance.
> Additionally, the classic `META-INF/services` mechanism is still used
> in module mode, however the service provider classes are filtered out
> if they are found to be located in a named module after loading the
> class. Since behavior differs between module and non-module mode, a
> library author which seeks to run in both environments while using
> ServiceLoader has to carefully consider how services might be loaded
> in a given environment.
I have some sympathy to the complaint that service providers deployed as
a module can define a static provider method or public constructor
whereas service providers deployed on the class path must define a
public constructor. The resolution of issue #ServiceLoaderEnhancements
[1] in JSR 376 did not propose to change existing behavior. Maybe that
specific ask could be looked at again but it would require great care.
On "the classic META-INF/services mechanism is still used in module
mode". I think you mean that creating ServiceLoader with a class loader
may locate META-INF/services configuration file in a named module.
Resources in META-INF/** are not encapsulated and it wouldn't be
surprising for a modular JAR declaring a service to also have a
META-INF/services configuration file for use on the class path. This is
the reason for the filtering, but it shouldn't be observable unless the
configuration file lists the name of a class that is not in the JAR file
(an anti-pattern is detected as packaging file) or is out of sync with
the module declaration. There is more than can be done at packaging time
to detect such mistakes [2].
-Alan.
[1]
https://mail.openjdk.org/pipermail/jpms-spec-experts/2016-September/000395.html
[2] https://bugs.openjdk.org/browse/JDK-8207339
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/jigsaw-dev/attachments/20241215/e776b7a2/attachment-0001.htm>
More information about the jigsaw-dev
mailing list