Graal and JDK11

Bob McWhirter bmcwhirt at redhat.com
Thu Apr 18 17:29:03 UTC 2019


Through a series of hacks, I've been able to create a `native-image` binary
based on JDK, and then use it to produce a simple binary native-image from
a Hello World application.

Unlike JDK8-based, I have to pass a significant amount of `-cp` and
`--module-path` arguments to the `native-image` CLI.

./latest_graalvm_home/lib/svm/bin/native-image \
  -cp
~/iron/test:/Users/bob/repos/graal/sdk/mxbuild/dists/jdk11/graal-sdk.jar:/Users/bob/repos/graal/substratevm/mxbuild/dists/jdk1.8/objectfile.jar:/Users/bob/repos/graal/truffle/mxbuild/dists/jdk11/truffle-api.jar:/Users/bob/repos/graal/compiler/mxbuild/dists/jdk11/graal.jar:/Users/bob/repos/graal/substratevm/mxbuild/dists/jdk1.8/pointsto.jar:/Users/bob/.mx/cache/HAMCREST_42a25dc3219429f0e5d060061f71acb49bf010a0/hamcrest.jar:/Users/bob/.mx/cache/JUNIT_2973d150c0dc1fefe998f834810d68f278ea58ec/junit.jar:/Users/bob/repos/protean/mx/mxbuild/dists/jdk1.8/junit-tool.jar:/Users/bob/repos/graal/truffle/mxbuild/dists/jdk11/truffle-nfi.jar:/Users/bob/repos/graal/substratevm/mxbuild/dists/jdk9/svm.jar:/Users/bob/.mx/cache/JLINE_c3aeac59c022bdc497c8c48ed86fa50450e4896a/jline.jar:/Users/bob/repos/graal/substratevm/mxbuild/dists/jdk1.8/library-support.jar:/Users/bob/repos/graal/substratevm/mxbuild/dists/jdk1.8/svm-driver.jar:/Users/bob/repos/graal/substratevm/mxbuild/dists/jdk1.8/svm-agent.jar
\
  Foo \

-J--module-path=/Users/bob/repos/graal/vm11/mxbuild/darwin-amd64/GRAALVM_CMP_GU_GVM_NFI_POLYNATIVE_RGX_STAGE1_SVM_SVMAG_SVMCF_SVML_TFL/graalvm-unknown-1.0.0-rc15-dev/Contents/Home/lib/svm/bin/../../boot/graal-sdk.jar:/Users/bob/repos/graal/vm11/mxbuild/darwin-amd64/GRAALVM_CMP_GU_GVM_NFI_POLYNATIVE_RGX_STAGE1_SVM_SVMAG_SVMCF_SVML_TFL/graalvm-unknown-1.0.0-rc15-dev/Contents/Home/lib/svm/bin/../../truffle/truffle-api.jar\

 -J--upgrade-module-path=/Users/bob/repos/graal/vm11/mxbuild/darwin-amd64/GRAALVM_CMP_GU_GVM_NFI_POLYNATIVE_RGX_STAGE1_SVM_SVMAG_SVMCF_SVML_TFL/graalvm-unknown-1.0.0-rc15-dev/Contents/Home/lib/svm/bin/../../jvmci/graal.jar:/Users/bob/repos/graal/vm11/mxbuild/darwin-amd64/GRAALVM_CMP_GU_GVM_NFI_POLYNATIVE_RGX_STAGE1_SVM_SVMAG_SVMCF_SVML_TFL/graalvm-unknown-1.0.0-rc15-dev/Contents/Home/lib/svm/bin/../../jvmci/graal-management.jar
\
  -J--add-opens=org.graalvm.truffle/com.oracle.truffle.polyglot=ALL-UNNAMED
\
  -J--add-opens=org.graalvm.truffle/com.oracle.truffle.api.impl=ALL-UNNAMED
\

-J--add-opens=jdk.internal.vm.compiler/org.graalvm.compiler.debug=ALL-UNNAMED
\
  -J--add-opens=org.graalvm.sdk/org.graalvm.polyglot=ALL-UNNAMED \
  -H:Name=foo \
  --no-server \
  -H:+ReportExceptionStackTraces

The resulting binary works as you'd expect for a simplistic app:

$ ./foo
Hello world from Java 11.0.1
$ du -sh ./foo
 13M ./foo
$ file ./foo
./foo: Mach-O 64-bit executable x86_64


Thus far I've mostly be faffing about to figure out what's needed.

Does anything have any insight on how to bake this stuff into the basic
execution of native-image, preferably storing all the module-path and such
inside the native-image binary itself, instead of having to reference
outboard modules/jars/etc?

Apologies if there's a better place/way to discuss this.

Thanks,

Bob McWhirter
Red Hat


More information about the graal-dev mailing list