原文はこちら。
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