前提
之前曾经写过一篇《SpringBoot3.x 原生镜像-Native Image 尝鲜》,当时SpringBoot
处于3.0.0-M5
版本,功能尚未稳定。这次会基于SpringBoot
当前最新的稳定版本3.1.2
详细分析Native Image
的实践过程。系统或者软件版本清单如下:
组件 | 版本 | 备注 |
---|---|---|
macOS Ventura |
13.4.1(c) |
ARM 架构 |
sdkman |
5.18.2 |
JDK 和各类SDK 包管理工具 |
Liberica Native Image Kit |
23.0.1.r17-nik |
可以构建Native Image 的JDK |
SpringBoot |
3.1.2 |
使用当前(2023-08-20 )最新发布版 |
Maven |
3.9.0 |
- |
安装 sdkman
sdkman是一个轻量级、支持多平台的开源开发工具管理器,可以通过它安装任意主流发行版本(例如OpenJDK
、Kona
、GraalVM
等等)的任意版本的JDK
。通过下面的命令可以轻易安装sdkman
:
curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"
sdk version
可以通过sdk list java
查看支持的JDK
发行版本:
通过shell
命令sdk install java $Identifier
就可以安装对应的JDK
发行版。例如可以这样安装GraalVM-ce-17
:
sdk install java 17.0.8-graalce
通过shell
命令sdk uninstall java $Identifier
可以卸载对应的JDK
发行版。如果安装了多个版本或者多个发行版的JDK
,可以通过shell
命令sdk default java $Identifier
去指定默认使用的JDK
版本,例如:
sdk default java 17.0.8-graalce
可以通过shell
命令sdk current
或者sdk current java
查看当前正在使用的SDK
或者JDK
版本。
安装 Liberica NIK
Liberica Native Image Kit
是bellsoft
出品的旨在创建高性能原生二进制(Native Binaries
)基于JVM
编写的应用的工具包,简称为Liberica NIK
。Liberica NIK
本质就是把OpenJDK
和多种其他工具包一起封装起来的JDK
发行版,在Native Image
功能应用过程,可以简单把它视为OpenJDK
+ GraalVM
的结合体。可以通过sdk list java
查看相应的JDK
版本:
这里选择JDK-17
的版本进行安装:
sdk install java 23.0.1.r17-nik
# 这里最好把此JDK设置为当前系统的默认JDK,否则后面编译镜像时候会提示找不到GraalVM
sdk default java 23.0.1.r17-nik
安装完成后,通过java -version
验证一下:
编写 SpringBoot 应用
基于Maven
新建一个SpringBoot
应用,这里已经整理好了一份POM
文件,实践过程可以直接用,如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.vlts</groupId>
<artifactId>spring-boot-native-image-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.2</version>
<relativePath/>
</parent>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.version>3.11.0</maven.compiler.version>
<maven.install.version>3.1.1</maven.install.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-websocket</artifactId>
</exclusion>
</exclusions>
</dependency>
<depende