> Please review this patch which adds a "jmodless" jlink mode to the JDK.
> Fundamentally this patch adds an option to use `jlink` even though your JDK
> install might not come with the packaged modules (directory `jmods`). This is
> particularly useful to further reduce the size of a jlinked runtime. After
> the removal of the concept of a JRE, a common distribution mechanism is still
> the full JDK with all modules and packaged modules. However, packaged modules
> can incur an additional size tax. For example in a container scenario it
> could be useful to have a base JDK container including all modules, but
> without also delivering the packaged modules. This comes at a size advantage
> of `~25%`. Such a base JDK container could then be used to `jlink`
> application specific runtimes, further reducing the size of the application
> runtime image (App + JDK runtime; as a single image *or* separate bundles,
> depending on the app being modularized).
>
> The basic design of this approach is to add a jlink plugin for tracking
> non-class and non-resource files of a JDK install. I.e. files which aren't
> present in the jimage (`lib/modules`). This enables producing a
> `JmodLessArchive` class which has all the info of what constitutes the final
> jlinked runtime.
>
> Basic usage example:
>
> $ diff -u <(./bin/java --list-modules --limit-modules java.se)
> <(../linux-x86_64-server-release/images/jdk/bin/java --list-modules
> --limit-modules java.se)
> $ diff -u <(./bin/java --list-modules --limit-modules java.se)
> <(../linux-x86_64-server-release/images/jdk/bin/java --list-modules
> --limit-modules jdk.jlink)
> $ ls ../linux-x86_64-server-release/images/jdk/jmods
> java.base.jmod java.net.http.jmod java.sql.rowset.jmod
> jdk.crypto.ec.jmod jdk.internal.opt.jmod
> jdk.jdi.jmod jdk.management.agent.jmod jdk.security.auth.jmod
> java.compiler.jmod java.prefs.jmod java.transaction.xa.jmod
> jdk.dynalink.jmod jdk.internal.vm.ci.jmod
> jdk.jdwp.agent.jmod jdk.management.jfr.jmod jdk.security.jgss.jmod
> java.datatransfer.jmod java.rmi.jmod java.xml.crypto.jmod
> jdk.editpad.jmod jdk.internal.vm.compiler.jmod
> jdk.jfr.jmod jdk.management.jmod jdk.unsupported.desktop.jmod
> java.desktop.jmod java.scripting.jmod java.xml.jmod
> jdk.hotspot.agent.jmod jdk.internal.vm.compiler.management.jmod
> jdk.jlink.jmod jdk.naming.dns.jmod jdk.unsupported...
Severin Gehwolf has updated the pull request with a new target base due to a
merge or a rebase. The pull request now contains 46 commits:
- Add @enablePreview for JImageValidator that uses classfile API
- Fix SystemModulesPlugin after merge
- Merge branch 'master' into jdk-8311302-jmodless-link
- Don't show the verbose hint when already verbose
- Use '_files' over '_resources' as the suffix for listing resources
- Remove the hidden option hint.
Also adjust the messages being printed when performing
a run-time image link.
- Localize messages, switch expression
- Rename RunImageArchive => JRTArchive and RunImageLinkException =>
RuntimeImageLinkException
Also moved the stamp file to jdk.jlink module. The resources files per
module now get unconditionally created (empty if no resources not in the
jimage).
- First round of addressing review feedback.
- Share resource names (JlinkTask and JlinkResourcesListPlugin)
- Exclude resources in JlinkResourcesListPlugin the same way
as done for other plugins.
- Rename AddRunImageResourcesPlugin => JlinkResourcesListPlugin
- ... and 36 more: https://git.openjdk.org/jdk/compare/87516e29...a797ea69
-------------
Changes: https://git.openjdk.org/jdk/pull/14787/files
Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=14787&range=11
Stats: 3069 lines in 39 files changed: 2976 ins; 48 del; 45 mod
Patch: https://git.openjdk.org/jdk/pull/14787.diff
Fetch: git fetch https://git.openjdk.org/jdk.git pull/14787/head:pull/14787
PR: https://git.openjdk.org/jdk/pull/14787