While you can find a lot of information regarding the Java "Project Jigsaw", I could
not really find a good example on "assembling" your own JVM. So I took a few minutes
to figure that out. My usecase here is that someone would like to use Instana (non free
tracing solution) which requires the java.instrument
and jdk.attach
module to be available.
From an operations perspektive we do not want to ship the whole JDK in our production
Docker Images, so we've to ship a modified JVM. Currently we base our images on the
builds provided by AdoptOpenJDK.net, so my
examples are based on those builds. You can just download and untar them to any directory
to follow along.
You can check the available modules of your JVM by runnning:
$ jdk-11.0.3+7-jre/bin/java --list-modules | grep -E '(instrument|attach)'
java.instrument@11.0.3
As you can see only the java.instrument
module is available. So let's assemble
a custom JVM which includes all the modules provided by the default AdoptOpenJDK.net JRE
builds and the missing jdk.attach
module:
$ jdk-11.0.3+7/bin/jlink --module-path jdk-11.0.3+7 --add-modules $(jdk-11.0.3+7-jre/bin/java --list-modules|cut -d'@' -f 1|tr '\n' ',')jdk.attach --output myjvm
$ ./myjvm/bin/java --list-modules | grep -E '(instrument|attach)'
java.instrument@11.0.3
jdk.attach@11.0.3
Size wise the increase is, as expected, rather minimal:
$ du -hs myjvm jdk-11.0.3+7-jre jdk-11.0.3+7
141M myjvm
121M jdk-11.0.3+7-jre
310M jdk-11.0.3+7
For the fun of it you could also add the compiler so you can execute source files directly:
$ jdk-11.0.3+7/bin/jlink --module-path jdk-11.0.3+7 --add-modules $(jdk-11.0.3+7-jre/bin/java --list-modules|cut -d'@' -f 1|tr '\n' ',')jdk.compiler --output myjvm2
$ ./myjvm2/bin/java HelloWorld.java
Hello World!