Spring Boot アプリケーションからのネイティブ実行可能ファイルのビルド

GraalVMネイティブ・イメージは、Spring Bootアプリケーションのパフォーマンスを大幅に向上させることができます。Spring Boot 3では、GraalVMネイティブ・イメージのサポートが統合されているため、プロジェクトの設定と構成が容易になります。

このガイドでは、Spring Boot 3アプリケーションからネイティブ実行可能ファイルをビルドする方法を示します。

アプリケーションの作成

デモ・パートでは、単純なRESTサーバーJavaアプリケーションを作成します。

  1. Spring Initializrに移動し、新しいSpring Bootプロジェクトを作成します。GraalVM Native SupportおよびSpring Webの依存関係を必ず追加してください。

  2. 「GENERATE」をクリックしてプロジェクトを作成し、.zipファイルとしてダウンロードします。ファイルを解凍し、任意のIDEで開きます。

    プロジェクト構成には、ネイティブ・ビルド・ツールなど、必要なすべての依存関係およびプラグインがすでに含まれています。たとえば、Mavenプロジェクトを作成した場合、pom.xmlファイルに追加される必須のプラグインは次のとおりです:

     <build>
         <plugins>
             <plugin>
                 <groupId>org.graalvm.buildtools</groupId>
                 <artifactId>native-maven-plugin</artifactId>
             </plugin>
             <plugin>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>
             </plugin>
         </plugins>
     </build>
    
  3. メイン・アプリケーション・クラスはイニシャライザによって作成されました。同じディレクトリで、HelloController.javaという名前のファイルに次の内容のRESTコントローラを作成します:
     package com.example.demo;
    
     import org.springframework.web.bind.annotation.GetMapping;
     import org.springframework.web.bind.annotation.RestController;
    
     @RestController
     public class HelloController {
    
         @GetMapping("/hello")
         public String hello() {
             return "Hello, GraalVM!";
         }
     }
    
  4. (オプション) Java HotSpot仮想マシンでアプリケーションをパッケージ化して実行します。
    Maven:
     ./mvnw spring-boot:run
    

    Gradle:

     ./gradlew bootRun
    

    これにより、アプリケーションをコンパイルし、JARファイルを作成してアプリケーションを実行します。

    アプリケーションは数百ミリ秒で起動します。ブラウザを開き、localhost:8080/helloに移動して、実行中のアプリケーションを確認します。"Hello, GraalVM!"と表示されます。

Paketo Buildpacksを使用したネイティブ実行可能ファイルのビルド

Spring Bootでは、GraalVMネイティブ・イメージを提供するPaketo Buildpack for Oracleを使用した、ネイティブ実行可能ファイルを含むコンテナ・イメージのビルドがサポートされます。

前提条件

Rancher DesktopDockerなどのDocker-API互換コンテナ・ランタイムがインストールされ、実行されていることを確認します。

  1. 最初に、ネイティブ・イメージ・ツールをリクエストするPaketo Buildpack for Oracleを有効にします。

    • Mavenpom.xmlファイルを開き、spring-boot-maven-plugin宣言を見つけて、次のように変更します:
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <image>
                    <builder>paketobuildpacks/builder-jammy-buildpackless-tiny</builder><!--required for AArch64/M1 support -->
                    <buildpacks>
                        <buildpack>paketobuildpacks/oracle</buildpack>
                        <buildpack>paketobuildpacks/java-native-image</buildpack>
                    </buildpacks>
                </image>
            </configuration>
        </plugin>
      

      また、pom.xmlファイルでspring-boot-starter-parentが使用されていることも確認してください。<parent>セクションは、イニシャライザによって追加されている必要があります。

    • Gradlebuild.gradleファイルを開き、次の行を追加します:
        bootBuildImage {
                builder = "paketobuildpacks/builder-jammy-buildpackless-tiny"
                buildpacks = ["paketobuildpacks/oracle", "paketobuildpacks/java-native-image"]
        }
      

      java-native-imageがリクエストされると、ビルドパックはネイティブ・イメージを含むOracle GraalVMをダウンロードします。

  2. ビルドパックを使用して、このSpringアプリケーションのネイティブ実行可能ファイルをビルドします:
    • Maven:
        ./mvnw -Pnative spring-boot:build-image
      
    • Gradle:
        ./gradlew bootBuildImage
      
  3. ビルドが完了すると、Dockerイメージが使用可能になります。docker runを使用してアプリケーションを起動できます。たとえば:
     docker run --rm -p 8080:8080 docker.io/library/demo:0.0.1-SNAPSHOT
    

Paketoのドキュメントはいくつかの例を提供しており、ビルドパックを使用してGraalVMネイティブ・イメージでアプリケーションをビルドする方法がわかります。

ネイティブ・ビルド・ツールを使用したネイティブ実行可能ファイルのビルド

Dockerを使用せず、ホスト・マシンにネイティブ実行可能ファイルを作成する場合は、ネイティブ・イメージをビルドするためのMavenおよびGradleプラグインを提供するネイティブ・ビルド・ツールを使用します。

前提条件

GraalVM JDKがインストール済であることを確認します。最も簡単に始めるには、SDKMAN!を使用します:

sdk install java 21.0.4-graal

21.0.4は、優先するGraalVMリリースまたは早期アクセス・ビルドに置き換えます。その他のインストール・オプションについては、「ダウンロード」セクションを参照してください。

  1. ネイティブ・ビルド・ツールを使用してネイティブ実行可能ファイルをビルドします:
    • Maven:
        ./mvnw -Pnative native:compile
      

      このコマンドは、プロジェクトをコンパイルし、target/ディレクトリにネイティブ実行可能ファイルdemoを作成します。

    • Gradle:
        ./gradlew nativeCompile
      

      このコマンドは、プロジェクトをコンパイルし、build/native/nativeCompile/ディレクトリにネイティブ実行可能ファイルdemoを作成します。

  2. ネイティブ実行可能ファイルからアプリケーションを実行します:
    • Maven:
        ./target/demo
      
    • Gradle:
        ./build/native/nativeCompile/demo
      

      Gradleでは、nativeRunタスクを実行することもできます: gradle nativeRun

      以前にHotSpotでこのアプリケーションを実行した場合、起動時間が大幅に短縮されたことがわかります。

このガイドでは、Spring Bootアプリケーションのネイティブ実行可能ファイルを作成する方法を示しました。これを行うには、コンテナ環境でPaketo Buildpacksを使用するか、ホスト・マシンでネイティブ・ビルド・ツールを使用します。

Spring Bootアプリケーションは、事前にネイティブ実行可能ファイルにコンパイルすると、高速で軽量になるだけでなく、特にクラウド・プラットフォームやコンテナなどのリソースが制約されている環境でも効率的になります。