Spring NativeでSpring BootプログラムをGraalVMに変換します。


Springは、既存のSpring Bootアプリケーション(JavaまたはKotlingで編纂)をGraaalVM本機の映像に変換するための新しいツールSpring Native Betaを発表しました。目的はスプリングブックでSpring Bootアプリケーションをサポートすることです。GraalVMは本機の映像が小さく、最適化され、起動速度が速いです。しかし、JVMと比べて、トレードオフの方法は構築時間が長く、運行時の最適化がより少ないです。
Spring NativeはGraalVMチームと協力して橋梁として働いて、GraalVMが伝統的なSpringBootコードを理解することを確保します。Oracle実験室の高級研究マネージャーのVojin Jovanovicは彼らとSpringの協力について話しています。
Springチームと協力して本機JVM生態システムを構築することはとても楽しいことです。彼らの深い技術知識とコミュニティに敏感な触覚は常に最高の解決策をもたらします。最新のSpring本機のバージョンとJVM生態系での大量使用は本機のコンパイルに広く採用されています。
バックグラウンドでは、MavenとGradeleが提供するプリセット(AOT)プラグインは、Springブートアプリケーションを本マシンコードに変換するために使用されます。これらのプラグインは、GraalVMがサポートしていないすべてのSpring要素(反射や代理など)のためにGraalVM本体構成を生成します。生成された構成はreflect-config.jsonファイルに格納されます。例えば、@Serviceで注釈した各クラスはJSONファイルに配置されている。
Spring本機のプロファイルがMETA-INF/Native-mageフォルダにあると仮定すれば、それらを発見することができます。このマシンのヒントは、MySQLドライバの構成など、SpringNativeがサポートされていない要素を設定するために使用できます。
新しいプロジェクトを作成する場合、Spring InitializerでSpring本機依存項を提供します。

いくつかの依存項、例えばspringdatajpaは、GralVMをサポートするために追加の構成が必要である。Springチームはプラグインを通してこれらの追加的な構成を提供します。例えば、IntititializrにSpringデータJPA依存項を追加した後、2つの追加のMavenプラグインSpring aot Maven pluginとhibernase enhance Maven pluginがpom.xmlファイルに追加されます。
この時点ですべての依存項がSpring Nativeによってサポートされているわけではない。initializerで生成されたSpring項目に未サポートの依存項が含まれている場合、HELP.mdファイルがリストされます。

任意の他のSpring Bootアプリケーションと同様に、Initializerはアプリケーションを実行するために適切なエントリクラスを自動的に作成します。

@SpringBootApplication
public class NativeApplication {

	public static void main(String[] args) {
		SpringApplication.run(NativeApplication.class, args);
	}
}
次に、REST controllerを提供して、アプリケーションをテストします。

@Controller
public class NativeEndpoint {

    @GetMapping("/native")
    public String nativeCall() {
        return "Native";
    }
}
標準的なSprigBoot依存項の他に、InitializerはSprigNativeサポートに新しい依存項を追加しました。

<dependency>
	<groupId>org.springframework.experimental</groupId>
	<artifactId>spring-native</artifactId>
	<version>${spring-native.version}</version>
</dependency>
spring boot mavenプラグインはいくつかの追加的な構成を受信しました。

<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>
Mavenは前もってコンパイルして本機の映像を生成するために使用できます。生成された実行可能ファイルには、必要なすべてのクラスとJDKからの静的なリンクがあります。最下層VMは、通常のjavavmではなく、実行時システムとして使用される。

$ ./mvnw spring-boot:build-image
コードのコンパイルと最適化には、イメージの構築に時間がかかります。このステップは、Dockerイメージで実行するには、かなりのメモリが必要です。以下のエラーが発生したら、Dockerのメモリ設定を追加します。

Exception in thread "native-image pid watcher" java.lang.OutOfMemoryError: 
   GC overhead limit exceeded
上記のMaven命令の出力を実行すると、GraalVM本体映像が含まれている結果Docer映像が表示されます。

Successfully built image 'docker.io/library/native:0.0.1-SNAPSHOT'
生成されたイメージは約82 MBで、実行アプリケーションのすべての内容が含まれています。

$ docker images
native  0.0.1-SNAPSHOT ... 81.9MB
Docker容器はポート8080で起動される:

$ docker run -p 8080:8080 native:0.0.1-SNAPSHOT
容器を起動した後、アプリケーションはほとんどすぐにテストができます。

$ curl localhost:8080/native --silent
Native
以上はSpring NativeでSpring BootプログラムをGraalVMに変換した詳細です。Spring BootプログラムについてGraalVMに変換した資料がもっと多いです。他の関連記事に注目してください。