Another one of the new tools that Jigsaw brings is 'jlink' which is a tool to produce custom run-time images, a single artefact containing both Java and the modules being run.
jlink is the linker tool and can be used to link a set of modules, along with their transitive dependencies, to create a custom modular run-time image (see JEP 220). The tool currently requires that modules on the module path be packaged in modular JAR or JMOD format.
In example creates a run-time image that contains the module com.greetings and its transitive dependencies:
The directory mlib on the module path contains the artifact for module com.greetings.
Note: in case one of the below .sh script fails due to the tree command, please take a look at Download and install the tree and wget command section in the README.md file and apply the appropriate solution.
Compile the 'hello world' example using:
$ ./compile.sh
Create JAR modules out of the class files:
$ ./packaging.sh
Run jlink to produce a new run-time image (distributable JDK + your app) for the 'hello world' example:
$ ./link.sh
Run the new run-time image (distributable JDK + your app):
$ ./run.sh
Inspect the images / artifacts created in the above process:
$ ./inspect.sh
Check the contents of all these script files (use the cat command or a text editor) to see what they are doing and why - interesting instructions and information in there.
Especially in the run.sh script, as this one reveals some interesting details about distributable JDK binaries + modules, module images.
See ../01_Greetings/README.md to learn more about package and module naming conventions and how to avoid confusions between them.
The jlink tool supports many advanced options to customize the generated image, see jlink --help for more options.
$JAVA_HOME/jmods is the directory containing java.base.jmod and the other standard and JDK modules.
If you using your own build of OpenJDK then the jmod files are in $BUILDOUTPUT/images/jmods, where $BUILDOUTPUT is the build output directory.
We will also see the jimage command in this example and learn how to create a JDK image with a smaller footprint.