Summary
When jpackage generates a run-time image using jlink no service bindings will be performed on the default module set. This is to align the jpackage implementation to what JEP 392 describes.
Problem
JEP 392 describes in the "Runtimes" section:
The default set of jlink options used by jpackage is
--strip-native-commands --strip-debug --no-man-pages --no-header-files
but this can be changed via the --jlink-options option. The resulting
image will not include all available service providers; if you want
those to be bound then use --jlink-options and include --bind-services
in the list of jlink options.
That is, it describes that no service binding will be performed, yet it actually does, before the modules set is being passed to jlink via --add-modules.
jpackage has a notion of ALL-DEFAULT modules when generating a run-time image for an application. When the token of ALL-DEFAULT gets resolved - which includes all modules that export API - service bindings are included. This is problematic when the base JDK running jpackage is JEP 493 enabled. Such a JDK doesn't allow for the jdk.jlink module to be included in the resulting run-time image. Since ToolProvider API is an exported and public API, including service bindings would cause jdk.jlink to be included in the output image as it provides implementations for jlink and jmod via the ToolProvider interface. Therefore, jpackage on a JEP 493 enabled JDK would fail, while it would pass on a JDK including JMODs. An inconsistency.
Solution
When resolving the ALL-DEFAULT token in jpackage don't perform service binding of the API exporting modules of the JDK. The resulting set of modules might be smaller as before, but it allows for a consistent set of modules to be included in the default run-time image jpackage generates, regardless of whether the base JDK is JEP 493-enabled or not.
Specification
The relevant change in jpackage is this:
@@ -99,8 +100,10 @@ private static Set<String> getDefaultModules(
ModuleFinder finder = createModuleFinder(paths);
+ // Don't perform service bindings by default as outlined by JEP 343
+ // and JEP 392
return Configuration.empty()
- .resolveAndBind(finder, ModuleFinder.of(), roots)
+ .resolve(finder, ModuleFinder.of(), roots)
.modules()
.stream()
.map(ResolvedModule::name)
That is, no service binding is performed by default when the ALL-DEFAULT token is resolved. That means that the resulting run-time image produced by jpackage might include fewer modules than prior to JDK 24.
If a user wishes to produce a similar run-time image than before, the --bind-services option would need to be passed in addition to the default jlink options --strip-native-commands --strip-debug --no-man-pages --no-header-files:
$ jpackage [...] --jlink-options \
"--strip-native-commands --strip-debug --no-man-pages --no-header-files --bind-services"
- csr of
-
JDK-8345185 Update jpackage to not include service bindings by default
-
- Resolved
-