jlink tool is used to assemble and optimize a
set of modules and their dependencies into a custom runtime image. ‘jlink’ tool comes as part of java 9
installation.
Open
command prompt or terminal and execute ‘jlink --help' command to get help of
all jlink commands.
$jlink --help
Usage: jlink <options> --module-path <modulepath> --add-modules <module>[,<module>...]
Possible options include:
--add-modules <mod>[,<mod>...] Root modules to resolve
--bind-services Link in service provider modules and
their dependences
-c, --compress=<0|1|2> Enable compression of resources:
Level 0: No compression
Level 1: Constant string sharing
Level 2: ZIP
--disable-plugin <pluginname> Disable the plugin mentioned
--endian <little|big> Byte order of generated jimage
(default:native)
-h, --help, -? Print this help message
--ignore-signing-information Suppress a fatal error when signed
modular JARs are linked in the image.
The signature related files of the
signed modular JARs are not copied to
the runtime image.
--launcher <name>=<module>[/<mainclass>]
Add a launcher command of the given
name for the module and the main class
if specified
--limit-modules <mod>[,<mod>...] Limit the universe of observable
modules
--list-plugins List available plugins
-p, --module-path <path> Module path
--no-header-files Exclude include header files
--no-man-pages Exclude man pages
--output <path> Location of output path
--post-process-path <imagefile> Post process an existing image
--resources-last-sorter <name> The last plugin allowed to sort
resources
--save-opts <filename> Save jlink options in the given file
-G, --strip-debug Strip debug information
--suggest-providers [<name>,...] Suggest providers that implement the
given service types from the module path
-v, --verbose Enable verbose tracing
--version Version information
@<filename> Read options from file
How to
build an image using jlink tool?
I am going
to use ‘services_example’ application that I created in my previous post to
build an image. I would recommend you to go through my previous post and build
‘services_example’ application.
‘service_example’
project structure looks like below.
$tree service_example/
service_example/
└── src
├── app.interfaces
│ ├── com
│ │ └── sample
│ │ └── app
│ │ └── interfaces
│ │ └── Circle.java
│ └── module-info.java
├── app.interfaces.impl
│ ├── com
│ │ └── sample
│ │ └── app
│ │ └── interfaces
│ │ └── impl
│ │ └── CircleImpl.java
│ └── module-info.java
├── app.interfaces.otherimpl
│ ├── com
│ │ └── sample
│ │ └── app
│ │ └── interfaces
│ │ └── otherimpl
│ │ └── CircleImpl.java
│ └── module-info.java
└── app.main
├── com
│ └── sample
│ └── app
│ └── App.java
└── module-info.java
22 directories, 8 files
Step 1:
Go to ‘service_example’
directory. Compile App.java and CircleImpl.java files by executing below
commands.
javac
--module-source-path src -d out src/app.main/com/sample/app/App.java
javac
--module-source-path src -d out
src/app.interfaces.impl/com/sample/app/interfaces/impl/CircleImpl.java
javac
--module-source-path src -d out
src/app.interfaces.otherimpl/com/sample/app/interfaces/otherimpl/CircleImpl.java
Total
project structure looks like below.
$tree
.
├── out
│ ├── app.interfaces
│ │ ├── com
│ │ │ └── sample
│ │ │ └── app
│ │ │ └── interfaces
│ │ │ └── Circle.class
│ │ └── module-info.class
│ ├── app.interfaces.impl
│ │ ├── com
│ │ │ └── sample
│ │ │ └── app
│ │ │ └── interfaces
│ │ │ └── impl
│ │ │ └── CircleImpl.class
│ │ └── module-info.class
│ ├── app.interfaces.otherimpl
│ │ ├── com
│ │ │ └── sample
│ │ │ └── app
│ │ │ └── interfaces
│ │ │ └── otherimpl
│ │ │ └── CircleImpl.class
│ │ └── module-info.class
│ └── app.main
│ ├── com
│ │ └── sample
│ │ └── app
│ │ └── App.class
│ └── module-info.class
└── src
├── app.interfaces
│ ├── com
│ │ └── sample
│ │ └── app
│ │ └── interfaces
│ │ └── Circle.java
│ └── module-info.java
├── app.interfaces.impl
│ ├── com
│ │ └── sample
│ │ └── app
│ │ └── interfaces
│ │ └── impl
│ │ └── CircleImpl.java
│ └── module-info.java
├── app.interfaces.otherimpl
│ ├── com
│ │ └── sample
│ │ └── app
│ │ └── interfaces
│ │ └── otherimpl
│ │ └── CircleImpl.java
│ └── module-info.java
└── app.main
├── com
│ └── sample
│ └── app
│ └── App.java
└── module-info.java
44 directories, 16 files
Step 2:
Generate jar files by
executing below commands.
Create
jars directory.
$mkdir jars $ $ls jars out src
Generate
jar files from modules by executing below commands.
jar
--create --file jars/app.interfaces.jar -C out/app.interfaces .
jar
--create --file jars/app.interfaces.impl.jar -C out/app.interfaces.impl .
jar
--create --file jars/app.interfaces.otherimpl.jar -C
out/app.interfaces.otherimpl .
jar
--create --file jars/app.main.jar
--main-class=com.sample.app.App -C out/app.main .
Total project
structure looks like below.
.
├── jars
│ ├── app.interfaces.impl.jar
│ ├── app.interfaces.jar
│ ├── app.interfaces.otherimpl.jar
│ └── app.main.jar
├── out
│ ├── app.interfaces
│ │ ├── com
│ │ │ └── sample
│ │ │ └── app
│ │ │ └── interfaces
│ │ │ └── Circle.class
│ │ └── module-info.class
│ ├── app.interfaces.impl
│ │ ├── com
│ │ │ └── sample
│ │ │ └── app
│ │ │ └── interfaces
│ │ │ └── impl
│ │ │ └── CircleImpl.class
│ │ └── module-info.class
│ ├── app.interfaces.otherimpl
│ │ ├── com
│ │ │ └── sample
│ │ │ └── app
│ │ │ └── interfaces
│ │ │ └── otherimpl
│ │ │ └── CircleImpl.class
│ │ └── module-info.class
│ └── app.main
│ ├── com
│ │ └── sample
│ │ └── app
│ │ └── App.class
│ └── module-info.class
└── src
├── app.interfaces
│ ├── com
│ │ └── sample
│ │ └── app
│ │ └── interfaces
│ │ └── Circle.java
│ └── module-info.java
├── app.interfaces.impl
│ ├── com
│ │ └── sample
│ │ └── app
│ │ └── interfaces
│ │ └── impl
│ │ └── CircleImpl.java
│ └── module-info.java
├── app.interfaces.otherimpl
│ ├── com
│ │ └── sample
│ │ └── app
│ │ └── interfaces
│ │ └── otherimpl
│ │ └── CircleImpl.java
│ └── module-info.java
└── app.main
├── com
│ └── sample
│ └── app
│ └── App.java
└── module-info.java
45 directories, 20 files
Step 3:
Execute below command
to run the application from jar files
$java --module-path jars/:$JAVA_HOME/jmods -m app.main/com.sample.app.App Going to get instances Area : 314.285714285 Perimeter : 62.857142857 Area : 314.0 Perimeter : 62.800000000000004
Step 4:
Generate image from
the jar files by executing below command.
jlink
--module-path jars/:$JAVA_HOME/jmods --add-modules app.main,app.interfaces.impl,app.interfaces.otherimpl
--output image
Above
command creates ‘image’ folder. Open image folder, you can see folders like
bin, conf etc.,
$./image/bin/java --list-modules app.interfaces app.interfaces.impl app.interfaces.otherimpl app.main java.base@12.0.1
Execute
below command to run App.java application.
./image/bin/java
-m app.main/com.sample.app.App
$./image/bin/java -m app.main/com.sample.app.App Going to get instances Area : 314.0 Perimeter : 62.800000000000004 Area : 314.285714285 Perimeter : 62.857142857
No comments:
Post a Comment