1. 概要

ネイティブイメージには、瞬時の起動やメモリ消費量の削減など、さまざまな利点があります。 したがって、Javaアプリケーションのネイティブイメージを作成したい場合があります。

このチュートリアルでは、Spring Nativeを調べて、BuildpacksとGraalVMのネイティブビルドツールを使用してネイティブイメージをコンパイルおよびビルドします。

2. 基本設定

前提条件として、後でネイティブイメージを実行するために必要なDockerをインストールします。

次に、 baeldung- spring -native という名前の単純なSpring Bootプロジェクトを作成し、チュートリアル全体でそれを使用してネイティブイメージを構築します。

次に、Springリポジトリへのリンクを追加して、後のセクションで必要な依存関係とプラグインをダウンロードしましょう。

<repositories>
    <repository>
        <id>spring-release</id>
        <name>Spring release</name>
        <url>https://repo.spring.io/release</url>
    </repository>
</repositories>
<pluginRepositories>
    <pluginRepository>
        <id>spring-release</id>
        <name>Spring release</name>
        <url>https://repo.spring.io/release</url>
    </pluginRepository>
</pluginRepositories>

次に、最新の spring -nativeMaven依存関係を追加します。

<dependency>
    <groupId>org.springframework.experimental</groupId>
    <artifactId>spring-native</artifactId>
    <version>0.10.0</version>
</dependency>

ただし、 Gradleプロジェクトの場合、SpringNativeはSpringAOTプラグインによって自動的に追加されます。

各SpringNativeバージョンは特定のSpringBootバージョンのみをサポートすることに注意してください。たとえば、SpringNative0.10.0はSpringBoot2.5.1をサポートします。 したがって、pom.xmlで互換性のあるSpringBootMaven依存関係を使用する必要があります。

次に、コンパイルにJava8を使用するためのいくつかのプロパティを追加します。

<properties>
    <java.version>1.8</java.version>
    <maven.compiler.target>1.8</maven.compiler.target>
    <maven.compiler.source>1.8</maven.compiler.source>
</properties>

最後に、SpringNativeAppクラスを作成します。

public class SpringNativeApp {
    public static void main(String[] args) {
        System.out.println("Hello, World! This is a Baeldung Spring Native Application");
    }
}

3. ビルドパック

Spring Bootプロジェクトbaeldung-spring -native の基本セットアップの準備ができたので、ビルドパックをSpring Bootプロジェクトに統合して、ネイティブイメージをビルドしましょう。

3.1. SpringBootMavenプラグイン

まず、 PaketoJavaビルドパックを使用したネイティブイメージ構成のspring-boot-maven-pluginが必要です。

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <image>
                    <builder>paketobuildpacks/builder:tiny</builder>
                    <env>
                        <BP_NATIVE_IMAGE>true</BP_NATIVE_IMAGE>
                    </env>
                </image>
            </configuration>
        </plugin>
    </plugins>
</build>

ここでは、ベースやフルなどの利用可能なさまざまなビルダーから小さなビルダーを使用してネイティブイメージを構築します。 また、true値をBP_NATIVE_IMAGE環境変数に提供することにより、ビルドパックを有効にしました。

同様に、Gradleを使用する場合、tinyビルダーをBP_NATIVE_IMAGE環境変数とともにbuild.gradleファイルに追加できます。

bootBuildImage {
    builder = "paketobuildpacks/builder:tiny"
    environment = [
        "BP_NATIVE_IMAGE" : "true"
    ]
}

3.2. SpringAOTプラグイン

次に、ネイティブイメージのフットプリントと互換性を向上させるのに役立つ事前変換を実行する SpringAOTプラグインを追加する必要があります。

それでは、最新の spring -aot-maven-pluginMaven依存関係をpom.xmlに追加しましょう。

<plugin>
    <groupId>org.springframework.experimental</groupId>
    <artifactId>spring-aot-maven-plugin</artifactId>
    <version>0.10.0</version>
</plugin>

同様に、Gradleプロジェクトの場合、最新のorg.springframework.experimental.aot依存関係をbuild.gradleファイルに追加できます。

plugins {
    id 'org.springframework.experimental.aot' version '0.10.0'
}

また、前述したように、これによりSpringNativeの依存関係がGradleプロジェクトに自動的に追加されます。

Spring AOTプラグインは、ソース生成を決定するためのいくつかのオプションを提供します。 たとえば、removeYamlSupportremoveJmxSupportなどのオプションは、それぞれ Spring BootYamlとSpringBootJMXのサポートを削除します。

3.3. イメージのビルドと実行

それでおしまい! Mavenコマンドを使用して、Spring Bootプロジェクトのネイティブイメージを構築する準備が整いました。

$ mvn spring-boot:build-image

Mavenコマンドは、 baeldung- spring -native:0.0.1-SNAPSHOTという名前のSpring Bootアプリのネイティブイメージを作成する必要があります。

注:ネイティブイメージの構築は多くのリソースを消費します。 したがって、ネイティブイメージの構築中に問題が発生した場合は、Dockerに割り当てられるメモリとCPUを増やす必要があります

最後に、 docker run コマンドを使用して、Dockerでアプリのイメージを実行できます。

$ docker run --rm -p 8080:8080 baeldung-spring-native:0.0.1-SNAPSHOT

したがって、アプリはほぼ瞬時に起動し、次のような出力を提供する必要があります。

Hello, World! This is a Baeldung Spring Native Application

4. GraalVMネイティブビルドツール

Paketoビルドパックの代わりに、 GraalVM ネイティブビルドツールを使用して、GraalVMのnative-imageコンパイラを使用してネイティブイメージをコンパイルおよびビルドできます。

4.1. ネイティブイメージコンパイラのインストール

前提条件として、セットアップのプロセスをスムーズにするためにSDKMANをインストールする必要があります。 次に、SDKMANを使用してGraalVMfor Java8をインストールできます。

$ sdk install java 21.0.0.2.r8

次に、GraalVMの21.0.0.2.r8ディストリビューションを指すJAVA_HOMEを設定します。

最後に、インストールされたGraalVMの21.0.0.2.r8ディストリビューションによって提供されるnative-imageコンパイラをインストールしましょう。

$ gu install native-image

4.2. 春のAOT

spring -native 依存関係に加えて、ネイティブビルドツールに必要な最新の spring -aotMaven依存関係をpom.xmlに追加します。

<dependency>
    <groupId>org.springframework.experimental</groupId>
    <artifactId>spring-aot</artifactId>
    <version>0.10.0</version>
</dependency>

4.3. SpringBootMavenプラグイン

Paketoビルドパックと同様に、GraalVMのネイティブビルドツールにも spring-boot-maven-pluginが必要です。

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

4.4. SpringAOTMavenプラグイン

また、 spring-aot-maven-pluginpom.xmlに追加し、generateを目標とします。

<plugin>
    <groupId>org.springframework.experimental</groupId>
    <artifactId>spring-aot-maven-plugin</artifactId>
    <version>0.10.0</version>
    <executions>
        <execution>
            <id>generate</id>
            <goals>
                <goal>generate</goal>
            </goals>
        </execution>
    </executions>
</plugin>

4.5. ネイティブプロファイル

次に、 native という名前のプロファイルを追加し、native-maven-pluginspring-boot-maven-pluginなどのいくつかのプラグインのビルドをサポートします。 ]:

<profiles>
    <profile>
        <id>native</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.graalvm.buildtools</groupId>
                    <artifactId>native-maven-plugin</artifactId>
                    <version>0.9.0</version>
                    <executions>
                        <execution>
                            <id>build-native</id>
                            <goals>
                                <goal>build</goal>
                            </goals>
                            <phase>package</phase>
                        </execution>
                    </executions>
                </plugin>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <configuration>
                        <classifier>exec</classifier>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

このプロファイルは、パッケージフェーズ中にビルドからnative-imageコンパイラーを呼び出します。

ただし、Gradleを使用する場合は、最新のorg.graalvm.buildtools.nativeプラグインをbuild.gradleファイルに追加します。

plugins {
    id 'org.graalvm.buildtools.native' version '0.9.0'
}

4.6. ビルドして実行

それでおしまい! Maven package コマンドでネイティブプロファイルを提供することにより、ネイティブイメージを構築する準備が整いました。

$ mvn -Pnative -DskipTests package

Mavenコマンドは、ターゲットフォルダーにbaeldung-spring-ネイティブエグゼキューターファイルを作成します。 したがって、エグゼキュータファイルにアクセスするだけでアプリを実行できます。

$ target/baeldung-spring-native
Hello World!, This is Baeldung Spring Native Application

5. 結論

このチュートリアルでは、ビルドパックおよびGraalVMのネイティブビルドツールとともにSpringネイティブについて説明しました。

まず、単純なSpring Bootプロジェクトを作成し、Paketoビルドパックを使用してネイティブイメージをビルドしました。 次に、GraalVMの native-image コンパイラを利用して、ネイティブイメージをビルドおよび実行するためのGraalVMのネイティブビルドツールを調べました。

いつものように、すべてのコード実装はGitHub利用できます。