ネイティブJavaに向けてウォーミングアップする

エキサイト株式会社エンジニアの佐々木です。

Advent Calendarの季節が今年もやってきました。 昨年同様、エキサイトホールディングス Advent Calendarで毎日投稿される予定です。 様々な話題が投稿されるのでぜひ閲覧してみてください!

qiita.com

超初心者向けになります。先日、Javaをネイティブイメージ化するGraalVMがOpenJDKに寄贈されるニュースがでました。 www.publickey1.jp また、SpringBoot3もネイティブイメージ化するSpringNativeモジュールを取り込まれました。spring.io

Javaの実行にはJDK/JREが必要でしたが、Native-Imageにすることによって不要になり、起動速度も秒からミリ秒になったりコンパクトに動作するようになるみたいです。これからくるであろうネイティブJavaに向けてウォーミングアップをしておきましょう。

前提

JDK

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