エキサイト株式会社エンジニアの佐々木です。
Advent Calendarの季節が今年もやってきました。 昨年同様、エキサイトホールディングス Advent Calendarで毎日投稿される予定です。 様々な話題が投稿されるのでぜひ閲覧してみてください!
超初心者向けになります。先日、Javaをネイティブイメージ化するGraalVMがOpenJDKに寄贈されるニュースがでました。 www.publickey1.jp また、SpringBoot3もネイティブイメージ化するSpringNativeモジュールを取り込まれました。spring.io
Javaの実行にはJDK/JREが必要でしたが、Native-Imageにすることによって不要になり、起動速度も秒からミリ秒になったりコンパクトに動作するようになるみたいです。これからくるであろうネイティブJavaに向けてウォーミングアップをしておきましょう。
前提
openjdk 17.0.5 2022-10-18 OpenJDK Runtime Environment GraalVM CE 22.3.0 (build 17.0.5+8-jvmci-22.3-b08) OpenJDK 64-Bit Server VM GraalVM CE 22.3.0 (build 17.0.5+8-jvmci-22.3-b08, mixed mode, sharing)
native-imageツールのインストール
Javaをネイティブイメージにするには、native-image
コマンドを使用します。GraalVMには、gu
コマンドが付属しており、これを使用してインストールします。
$ gu install native-image $ native-image --version GraalVM 22.3.0 Java 17 CE (Java Version 17.0.5+8-jvmci-22.3-b08)
これで、インストールが完了しました。
Hello,World
まずはHello,Worldからやってみます。
build.gradle
plugins { id 'java' } group 'org.example' version '1.0-SNAPSHOT' repositories { mavenCentral() } dependencies { compileOnly 'org.projectlombok:lombok:1.18.24' annotationProcessor 'org.projectlombok:lombok:1.18.24' testCompileOnly 'org.projectlombok:lombok:1.18.24' testAnnotationProcessor 'org.projectlombok:lombok:1.18.24' testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' } jar { manifest { attributes "Main-Class":"jp.co.excite.Main" } baseName 'HelloWorld' } test { useJUnitPlatform() }
今回実行可能Jarをネイティブイメージ化していきます。
コード
シンプルなHelloWorldです。
package jp.co.excite; public class Main { public static void main(String[] args) { System.out.println("Hello world!"); } }
手順としては、実行可能Jarの生成 -> GraalVMでネイティブイメージ生成
になります。
実行可能Jarの生成
$ ./gradlew assemble $ ls build/libs/ HelloWorld-1.0-SNAPSHOT.jar
実行可能Jarファイルができています。実行してみます。
$ time java -jar ./build/libs/HelloWorld-1.0-SNAPSHOT.jar Hello world! real 0m0.047s user 0m0.043s sys 0m0.013s
実行できました。47msくらいかかってますね。
GraalVMでネイティブイメージ生成
native-imageコマンドを使ってネイティブイメージ化して、実行します。
$ native-image -jar build/libs/HelloWorld-1.0-SNAPSHOT.jar HelloWorld $ time ./HelloWorld Hello world! real 0m0.007s user 0m0.002s sys 0m0.002s
実行できました。7msで応答できています。
まとめ
Javaをネイティブイメージ化するのは簡単でした。起動も速くなりこれからが楽しみです。ネイティブイメージ化にはいくつかの制約があり、静的検出できないコードは実行時に失敗します。リフレクションでも使えるものと使えないものがあります。どこかで取り上げようと思います。
最後に
エキサイトではフロントエンジニア、バックエンドエンジニア、アプリエンジニアを随時募集しております。長期インターンも歓迎していますので、興味があれば連絡いただければと思います。
カジュアル面談はこちらになります! meety.net
募集職種一覧はこちらになります!(カジュアルからもOK) www.wantedly.com