Using ServiceLoader with modules

Alex Buckley alex.buckley at oracle.com
Mon Oct 14 18:56:32 UTC 2019


I came across a recent blog entry about using ServiceLoader in a modular 
environment:

   https://blog.frankel.ch/migrating-serviceloader-java-9-module-system/

Unfortunately, it is completely wrong in its advice on "Migrating to the 
Java Platform Module System". I have seen the same bad advice on 
StackOverflow, so let me correct it here, as simply as possible:

1. The module containing the implementation SHOULD NOT export the 
implementation package.

2. The module containing the client MUST say that it uses the service 
interface.

See the "Deploying service providers as modules" section of 
https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/util/ServiceLoader.html

The whole point of integrating ServiceLoader with the module system was 
get the configuration documented explicitly, via `uses` and `provides` 
clauses. Benefits: the implementation is strongly encapsulated (no 
`exports`), and the client's service lookup is speedy because its 
dependency (`uses`) was found cheaply during startup. Eventually, as the 
blog rightly says, "only the configuration changes: the Service Loader 
code itself in the client doesn’t change."

Alex


More information about the jigsaw-dev mailing list