On 26/03/2016 02:45, Stefan Dollase wrote:
Hello,

I read the article in [1], which describes the problem that jlink cannot
figure out which service providing modules should be included into the
custom modular run-time image. In [2] there is a statement about this:
Previously, jlink included all service providing modules. Now, none of them
is included. Since I am not sure whether this was already discussed, I
would like to suggest a third approach:
JEP 282 [1] lists services as an open issue.

Yes, it was the case, at least for a brief period, that service providers were linked in automatically. It immediately leads to calls for ways to keep providers out and it gets very complicated once you have a command-line that it try to add and exclude modules at the same time.

So as things stand, jlink is an advanced tool and you do need to know about service providers when creating a custom runtime image. If you want specific crypto support or a specific dynamic language then you need specify the names of the modules to -addmods when creating the runtime image.

On extending the `uses` clause then this may be something to send to jpms-spec-comments for consideration if you feel it is important. One thing to be aware of is that the early exploratory phase of Project Jigsaw had `requires service S` and `requires optional service S`. The former could cause resolution to fail if there weren't any modules providing implementations of S. The latter is more like what we have today with `uses`.

At least for usages in the JDK, then we almost always used the latter in the prototypes at the time. One reason is the consumer modules often have a default implementation to use when there aren't any implementations deployed. The java.xml module has a default implementation of each of the XML parser types for example. There are a few cases, like the java.scripting or java.naming modules where there isn't any notion of the default implementation but it's not an error in either case to link or run without any service providers. The reason is that service provider modules may be loaded at runtime, maybe into module layers that a container creates.

-Alan

[1] http://openjdk.java.net/jeps/282

Reply via email to