mutao.net

いわゆる雑記。

GraalVM

なんでやったの

Java(TM) SE Runtime Environment 18.9 (build 11.0.3+12-LTS)
  • ユニバーサルJVMだからJavaのmoduleをPythonで作るとかできるらしい。
  • JakartaEE勉強のための一環
  • メイン機がWindows Homeなので仕方なくAWSインスタンス立てテストしてみる。

インストール

  • とりあえず最新版
$ https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-20.0.0/graalvm-ce-java11-linux-amd64-20.0.0.tar.gz
  • 解凍して名前変えとく
$ tar xf graalvm-ce-java11-linux-amd64-20.0.0.tar.gz
$ mv graalvm-ce-java11-20.0.0 graalvm-ce
$ sudo mv graalvm-ce /usr/local/
$ ls -l /usr/local/graalvm-ce/
total 352
drwxrwxr-x  2 ec2-user ec2-user   4096 Apr 19 09:35 bin
drwxrwxr-x  4 ec2-user ec2-user    112 Apr 19 09:35 conf
-rw-rw-r--  1 ec2-user ec2-user   2316 Feb 17 18:22 GRAALVM-README.md
drwxrwxr-x  3 ec2-user ec2-user    152 Apr 19 09:35 include
drwxrwxr-x  2 ec2-user ec2-user   4096 Apr 19 09:35 jmods
drwxrwxr-x  6 ec2-user ec2-user     52 Apr 19 09:35 languages
drwxrwxr-x 71 ec2-user ec2-user   4096 Apr 19 09:35 legal
drwxrwxr-x 14 ec2-user ec2-user   4096 Apr 19 09:35 lib
-rw-rw-r--  1 ec2-user ec2-user  27181 Feb 17 18:22 LICENSE.txt
-rw-r--r--  1 ec2-user ec2-user   3541 Feb 17 18:44 release
-rw-rw-r--  1 ec2-user ec2-user 306188 Feb 17 18:22 THIRD_PARTY_LICENSE.txt
drwxrwxr-x  7 ec2-user ec2-user     91 Apr 19 09:35 tools
  • binの中
$ ls -l /usr/local/graalvm-ce/bin
total 141336
lrwxrwxrwx 1 ec2-user ec2-user        23 Feb 17 18:44 gu -> ../lib/installer/bin/gu
-rwxr-xr-x 1 ec2-user ec2-user      8736 Feb 17 18:40 jar
-rwxr-xr-x 1 ec2-user ec2-user      8736 Feb 17 18:40 jarsigner
-rwxr-xr-x 1 ec2-user ec2-user      8720 Feb 17 18:40 java
-rwxr-xr-x 1 ec2-user ec2-user      8784 Feb 17 18:40 javac
-rwxr-xr-x 1 ec2-user ec2-user      8784 Feb 17 18:40 javadoc
-rwxr-xr-x 1 ec2-user ec2-user      8736 Feb 17 18:40 javap
-rwxr-xr-x 1 ec2-user ec2-user      8736 Feb 17 18:40 jcmd
-rwxr-xr-x 1 ec2-user ec2-user     12888 Feb 17 18:40 jconsole
-rwxr-xr-x 1 ec2-user ec2-user      8736 Feb 17 18:40 jdb
-rwxr-xr-x 1 ec2-user ec2-user      8736 Feb 17 18:40 jdeprscan
-rwxr-xr-x 1 ec2-user ec2-user      8736 Feb 17 18:40 jdeps
-rwxr-xr-x 1 ec2-user ec2-user      8736 Feb 17 18:40 jfr
-rwxr-xr-x 1 ec2-user ec2-user      8736 Feb 17 18:40 jhsdb
-rwxr-xr-x 1 ec2-user ec2-user      8736 Feb 17 18:40 jimage
-rwxr-xr-x 1 ec2-user ec2-user     12880 Feb 17 18:40 jinfo
-rwxr-xr-x 1 ec2-user ec2-user      8784 Feb 17 18:40 jjs
-rwxr-xr-x 1 ec2-user ec2-user      8784 Feb 17 18:40 jlink
-rwxr-xr-x 1 ec2-user ec2-user     12880 Feb 17 18:40 jmap
-rwxr-xr-x 1 ec2-user ec2-user      8736 Feb 17 18:40 jmod
-rwxr-xr-x 1 ec2-user ec2-user      8736 Feb 17 18:40 jps
-rwxr-xr-x 1 ec2-user ec2-user      8792 Feb 17 18:40 jrunscript
lrwxrwxrwx 1 ec2-user ec2-user        22 Feb 17 18:44 js -> ../languages/js/bin/js
-rwxr-xr-x 1 ec2-user ec2-user      8736 Feb 17 18:40 jshell
-rwxr-xr-x 1 ec2-user ec2-user     12880 Feb 17 18:40 jstack
-rwxr-xr-x 1 ec2-user ec2-user      8736 Feb 17 18:40 jstat
-rwxr-xr-x 1 ec2-user ec2-user      8736 Feb 17 18:40 jstatd
-rwxr-xr-x 1 ec2-user ec2-user      6341 Feb  6 17:35 jvisualvm
-rwxr-xr-x 1 ec2-user ec2-user      8736 Feb 17 18:40 keytool
lrwxrwxrwx 1 ec2-user ec2-user        25 Feb 17 18:44 lli -> ../languages/llvm/bin/lli
lrwxrwxrwx 1 ec2-user ec2-user        24 Feb 17 18:44 node -> ../languages/js/bin/node
lrwxrwxrwx 1 ec2-user ec2-user        23 Feb 17 18:44 npm -> ../languages/js/bin/npm
-rwxr-xr-x 1 ec2-user ec2-user      8736 Feb 17 18:40 pack200
-rwxr-xr-x 1 ec2-user ec2-user 144200783 Feb 17 18:44 polyglot
-rwxr-xr-x 1 ec2-user ec2-user      8736 Feb 17 18:40 rmic
-rwxr-xr-x 1 ec2-user ec2-user      8736 Feb 17 18:40 rmid
-rwxr-xr-x 1 ec2-user ec2-user      8744 Feb 17 18:40 rmiregistry
-rwxr-xr-x 1 ec2-user ec2-user      8736 Feb 17 18:40 serialver
-rwxr-xr-x 1 ec2-user ec2-user    117704 Feb 17 18:40 unpack200
  • javaのバージョン確認
$ /usr/local/graalvm-ce/bin/java -version
openjdk version "11.0.6" 2020-01-14
OpenJDK Runtime Environment GraalVM CE 20.0.0 (build 11.0.6+9-jvmci-20.0-b02)
OpenJDK 64-Bit Server VM GraalVM CE 20.0.0 (build 11.0.6+9-jvmci-20.0-b02, mixed mode, sharing)
  • JVMがGraalになってる
OpenJDK Runtime Environment GraalVM CE 20.0.0 (build 11.0.6+9-jvmci-20.0-b02)
  • javaのpath通した
$ java -version
openjdk version "11.0.6" 2020-01-14
OpenJDK Runtime Environment GraalVM CE 20.0.0 (build 11.0.6+9-jvmci-20.0-b02)
OpenJDK 64-Bit Server VM GraalVM CE 20.0.0 (build 11.0.6+9-jvmci-20.0-b02, mixed mode, sharing)
  • 適当になんか書く
public class GraalTest {
    public static void main(String[] args) {
        System.out.print("Hello World!\n");
    }
}
$ gu install native-image
  • 失敗した
$ native-image GraalTest
Build on Server(pid: 948, port: 33429)
[graaltest:948]    classlist:     524.06 ms,  0.37 GB
[graaltest:948]        (cap):     365.60 ms,  0.37 GB
[graaltest:948]        setup:     557.88 ms,  0.37 GB
Error: Unable to compile C-ABI query code. Make sure native software development toolchain is installed on your system.
Error: Use -H:+ReportExceptionStackTraces to print stack
  • とりあえずverbose
$ native-image --verbose GraalTest
Build on Server(pid: 948, port: 33429)
SendBuildRequest [
-task=com.oracle.svm.hosted.NativeImageGeneratorRunner
-imagecp
/usr/local/graalvm-ce/lib/svm/builder/svm-llvm.jar:/usr/local/graalvm-ce/lib/svm/builder/graal-llvm.jar:/usr/local/graalvm-ce/lib/svm/builder/llvm-wrapper-shadowed.jar:/usr/local/graalvm-ce/lib/svm/builder/javacpp-shadowed.jar:/usr/local/graalvm-ce/lib/svm/builder/llvm-platform-specific-shadowed.jar:/usr/local/graalvm-ce/lib/svm/builder/svm.jar:/usr/local/graalvm-ce/lib/svm/builder/objectfile.jar:/usr/local/graalvm-ce/lib/svm/builder/pointsto.jar:/usr/local/graalvm-ce/lib/svm/library-support.jar:/home/ec2-user/java
-H:Path=/home/ec2-user/java
-H:CLibraryPath=/usr/local/graalvm-ce/lib/svm/clibraries/linux-amd64
-H:Class=GraalTest
-H:Name=graaltest
]
[graaltest:948]    classlist:     486.59 ms,  0.37 GB
[graaltest:948]        (cap):     317.02 ms,  0.37 GB
[graaltest:948]        setup:     466.29 ms,  0.37 GB
Error: Unable to compile C-ABI query code. Make sure native software development toolchain is installed on your system.
Error: Use -H:+ReportExceptionStackTraces to print stacktrace of underlying exception
Error: Image build request failed with exit status 1
com.oracle.svm.driver.NativeImage$NativeImageError: Image build request failed with exit status 1
        at com.oracle.svm.driver.NativeImage.showError(NativeImage.java:1527)
        at com.oracle.svm.driver.NativeImage.build(NativeImage.java:1289)
        at com.oracle.svm.driver.NativeImage.performBuild(NativeImage.java:1250)
        at com.oracle.svm.driver.NativeImage.main(NativeImage.java:1209)
        at com.oracle.svm.driver.NativeImage$JDK9Plus.main(NativeImage.java:1707)

エラー文言でぐぐったけどWindows系の対処方法しかなかった

解決

  • doc はちゃんと読もうね
For compilation native-image depends on the local toolchain, so please make sure: glibc-devel, zlib-devel (header files for the C library and zlib) and gcc are available on your system.
  • 下記を実行
sudo yum install glibc-devel
sudo yum install zlib-devel
sudo yum install gcc
  • 再実行、うまくいったっぽい
$ native-image --verbose GraalTest
Build on Server(pid: 948, port: 33429)
SendBuildRequest [
-task=com.oracle.svm.hosted.NativeImageGeneratorRunner
-imagecp
/usr/local/graalvm-ce/lib/svm/builder/svm-llvm.jar:/usr/local/graalvm-ce/lib/svm/builder/graal-llvm.jar:/usr/local/graalvm-ce/lib/svm/builder/llvm-wrapper-shadowed.jar:/usr/local/graalvm-ce/lib/svm/builder/javacpp-shadowed.jar:/usr/local/graalvm-ce/lib/svm/builder/llvm-platform-specific-shadowed.jar:/usr/local/graalvm-ce/lib/svm/builder/svm.jar:/usr/local/graalvm-ce/lib/svm/builder/objectfile.jar:/usr/local/graalvm-ce/lib/svm/builder/pointsto.jar:/usr/local/graalvm-ce/lib/svm/library-support.jar:/home/ec2-user/java
-H:Path=/home/ec2-user/java
-H:CLibraryPath=/usr/local/graalvm-ce/lib/svm/clibraries/linux-amd64
-H:Class=GraalTest
-H:Name=graaltest
]
[graaltest:948]    classlist:     586.08 ms,  0.37 GB
[graaltest:948]        (cap):   1,519.61 ms,  0.37 GB
[graaltest:948]        setup:   4,825.24 ms,  0.37 GB
[graaltest:948]   (typeflow):  20,870.66 ms,  0.37 GB
[graaltest:948]    (objects):  12,267.76 ms,  0.37 GB
[graaltest:948]   (features):     500.71 ms,  0.37 GB
[graaltest:948]     analysis:  34,038.85 ms,  0.37 GB
[graaltest:948]     (clinit):     459.90 ms,  0.37 GB
[graaltest:948]     universe:   1,395.97 ms,  0.37 GB
[graaltest:948]      (parse):   7,364.63 ms,  0.37 GB
[graaltest:948]     (inline):   4,375.56 ms,  0.37 GB
[graaltest:948]    (compile):  33,904.71 ms,  0.37 GB
[graaltest:948]      compile:  46,654.57 ms,  0.37 GB
[graaltest:948]        image:   2,174.40 ms,  0.37 GB
[graaltest:948]        write:     358.19 ms,  0.37 GB
[graaltest:948]      [total]:  90,857.98 ms,  0.37 GB
  • 作成したimageを実行してみる
$ ./graaltest
Hello World!

今更

  • Javaディストリビューション何使うか迷ってたけど、GraalVM使うと OracleOpenJDK入ってみるみたい
  • AWSだからAmazon Corret使うべきかなとか迷っている
  • Javaをそのままそっくり入れ替えたら動くのかな
  • Applicationを動作させるためにはRootDirectoryにこのimage設置すればいい?
  • JDKの最新版に追いつけるのか問題が自分の中で勃発している。