Oracle GraalVM Support has Arrived!

原文はこちら。
The original article was written by Daniel Mikusa (Sr. Software Developer @ 7SIGNAL).
https://blog.paketo.io/posts/oracle-graalvm-support-has-arrived/

Oracle GraalVM Support has Arrived!

本日、Oracle GraalVMによるnative imageアプリケーションのビルドサポートが始まりました。

Oracle GraalVM
https://oracle.com/java/graalvm/

Oracleが Oracle GraalVMをGraalVM Free Licenseの下でリリースして以来、そのサポートを追加するために多くのフィードバックを受け取ってきました。3.11.0リリースのPaketo Buildpack for Oracleから、公式サポートが開始されました!

GraalVM Free License
https://blogs.oracle.com/java/post/graalvm-free-license

この最初のリリースでは、Oracle GraalVMでnative imageアプリケーションをビルドできます。アプリケーションのビルドは簡単です。Native Image Toolkitを選択し、Oracle buildpackを使用するプロセスに従います。

例えば、Paketo Maven Spring Boot Sample Appをpackでビルドしたい場合、

pack build applications/native-image \
-b paketo-buildpacks/oracle \
-b urn:cnb:builder:paketo-buildpacks/java-native-image \
--builder paketobuildpacks/builder-jammy-tiny \
--env BP_MAVEN_ACTIVE_PROFILES=native

を実行するだけです。

Paketo Maven Spring Boot Sample App
https://github.com/paketo-buildpacks/samples/tree/main/java/native-image/spring-boot-native-image-maven

この小さな変更だけで、Paketo Buildpacks に、Native Imageを含むデフォルトの JDK ディストリビューション(Bellsoft製)を上書きし、代わりに Oracle GraalVM を使うように指示できます。

イメージをビルドすると、Paketo buildpacksがOracle GraalVMをダウンロード、インストール、実行しているのがわかることでしょう。

...
Paketo Buildpack for Oracle 3.11.0
  https://github.com/paketo-buildpacks/oracle
  Build Configuration:
    $BP_JVM_JLINK_ARGS           --no-man-pages --no-header-files --strip-debug --compress=1  configure custom link arguments (--output must be omitted)
    $BP_JVM_JLINK_ENABLED        false                                                        enables running jlink tool to generate custom JRE
    $BP_JVM_TYPE                 JRE                                                          the JVM type - JDK or JRE
    $BP_JVM_VERSION              17                                                           the Java version
  Launch Configuration:
    $BPL_DEBUG_ENABLED           false                                                        enables Java remote debugging support
    $BPL_DEBUG_PORT              8000                                                         configure the remote debugging port
    $BPL_DEBUG_SUSPEND           false                                                        configure whether to suspend execution until a debugger has attached
    $BPL_HEAP_DUMP_PATH                                                                       write heap dumps on error to this path
    $BPL_JAVA_NMT_ENABLED        true                                                         enables Java Native Memory Tracking (NMT)
    $BPL_JAVA_NMT_LEVEL          summary                                                      configure level of NMT, summary or detail
    $BPL_JFR_ARGS                                                                             configure custom Java Flight Recording (JFR) arguments
    $BPL_JFR_ENABLED             false                                                        enables Java Flight Recording (JFR)
    $BPL_JMX_ENABLED             false                                                        enables Java Management Extensions (JMX)
    $BPL_JMX_PORT                5000                                                         configure the JMX port
    $BPL_JVM_HEAD_ROOM           0                                                            the headroom in memory calculation
    $BPL_JVM_LOADED_CLASS_COUNT  35% of classes                                               the number of loaded classes in memory calculation
    $BPL_JVM_THREAD_COUNT        250                                                          the number of threads in memory calculation
    $JAVA_TOOL_OPTIONS                                                                        the JVM launch flags
    Using buildpack default Java version 17
  Oracle GraalVM 17.0.9: Contributing to layer
    Downloading from https://download.oracle.com/graalvm/17/archive/graalvm-jdk-17.0.9_linux-x64_bin.tar.gz
    Verifying checksum
    Expanding to /layers/paketo-buildpacks_oracle/native-image-svm
    Adding 137 container CA certificates to JVM truststore
    Writing env.build/JAVA_HOME.override
    Writing env.build/JDK_HOME.override
...

この例は、私が気に入っているbuildpacksの特徴の1つである、JVMとNative Imageのディストリビューション切り替えが簡単であることを示しています。Oracle GraalVMは素晴らしいのですが、GraalVM Community Editionを使うように切り替えたいと思うかもしれません。でもそれも簡単です。

paketo-buildpacks/graalvm

paketo-buildpacks/oracle

に入れ替えるだけなのですから。たった2秒の変更で、異なるディストリビューションを使ってビルドできるようになります。

同じように簡単に、バージョンの入れ替えもできます。Oracle buildpackは現在、Java 17と21の両方をサポートしており、BP_JVM_VERSIONフラグを設定して選択できます。例えば、Java 21のNative Imageアプリケーションをビルドするのであれば、

pack build applications/native-image \
-b paketobuildpacks/oracle \
-b urn:cnb:builder:paketo-buildpacks/java-native-image \
--builder paketobuildpacks/builder-jammy-tiny \
--env BP_MAVEN_ACTIVE_PROFILES=native \
--env BP_JVM_VERSION=21

でOKですこれによって新しいバージョンを試すのが簡単になり、結果的にアップグレードが簡単になります。

Spring Boot Build Tools

Spring Boot Build Toolsを使ってアプリケーションイメージを生成している場合、Oracle GraalVMを以下の変更をつけて利用できます。

Maven

1. pom.xmlのNative Image生成ブロックを変更
....
<configuration>
    <image>
        <builder>paketobuildpacks/builder-jammy-tiny:latest</builder>
        <buildpacks>
            <buildpack>docker.io/paketobuildpacks/oracle</buildpack>
            <buildpack>urn:cnb:builder:paketo-buildpacks/java-native-image</buildpack>
        </buildpacks>
    </image>
</configuration>
...
2. その後、Native Imageビルドのために以下を実行
./mvnw spring-boot:build-image -Pnative

Gradle

1. Mavenの場合と同様の変更をbuild.gradleに対して施します。
...
tasks.named("bootBuildImage") {
  builder = "paketobuildpacks/builder-jammy-tiny:latest"
  buildpacks = ["docker.io/paketobuildpacks/oracle", "urn:cnb:builder:paketo-buildpacks/java-native-image"]
}
...
2. その後、Native Imageビルドのために以下を実行
./gradlew bootBuildImage

Future Roadmap

現時点では、Oracle buildpackはOracle free JDKを使ったJavaアプリケーション実行をサポートしています。

Oracle free JDK
https://oracle.com/java/technologies/downloads/

そして、Oracle GraalVMを使ったNative Imageアプリケーションのビルドをサポートしています。Oracle GraalVMをJDKとして使ったJavaアプリケーション実行のサポートは、現在積み残しの状態です。

これを最初のサポートから省いたのは、リリースがさらに遅れることになるためで、これはやりたくなかったのです。また、Paketoプロジェクトでの今後の作業によって、このサポートはかなり容易になると考えています。

これが意味するのは、今のところ、GraalVMでJavaアプリの実行はできない、ということです。私たちは将来的にこれをサポートするために懸命に頑張りますが、それまでの間、Native ImageビルドのためにOracle GraalVMをお使いください。

いつものように、私たちのGitHubディスカッション・ページに質問やコメントを投稿するか、Paketo Slackに参加して#java ルームで私たちとチャットしてください。

paketo-buildpacks Java Team
https://github.com/orgs/paketo-buildpacks/discussions/categories/java-team
Paketo Slack (2023/12/11現在新規登録できないようです)
https://slack.paketo.io

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください