graalvm编译springboot3 native应用

         云原生时代容器先行,为了更好的拥抱云原生,spring boot3之后,推出了graalvm编译boot项目,利用jvm的AOT( Ahead Of Time )运行前编译技术,可以将java源码直接构建成机器码二进制的文件,无需jdk静态编译为class字节码,运行时jre解释执行,这样就无需依赖java环境运行,部署到容器中可以直接启动运行。

          AOT 内存占用低,启动速度快,可以无需 runtime 运行,直接将 runtime 静态链接至最终的程序中,但是无运行时性能加成,不能根据程序运行情况做进一步的优化。 

         下面通过实例demo测试一下这个新特性。

一、搭建SpringBoot3项目

          使用gradle工具构建项目,项目结构如下:

  1、build.gradle依赖配置

  (1) boot3-app配置

plugins {
    id 'java'
}

group 'org.example.cn'
version '1.0-SNAPSHOT'

(2) graalvm-app配置

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.2.6'
    id 'io.spring.dependency-management' version '1.1.5'
    id 'org.graalvm.buildtools.native' version '0.9.28'
}

group 'org.example.cn'
version '1.0-SNAPSHOT'

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(17)
    }
}

repositories {
    maven { url 'https://maven.aliyun.com/repository/central/' }
    maven { url 'https://maven.aliyun.com/repository/public/' }
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
}

   2、测试接口


@RestController
@RequestMapping("/api")
public class RestApi {

    @GetMapping("/dataList")
    public List<String>  getDataList(){
        String d = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        String[] arr = { "C" ,"C++","JAVA","GoLang","Rust","Python",d};
        return Arrays.stream(arr).toList();
    }
}

二、构建native镜像

         在Linux环境分别安装gradle和graalvm-jdk

1、graalvm安装

          官网下载地址:https://www.graalvm.org/downloads/

          ssh远程到服务器下载

    wget  https://download.oracle.com/graalvm/17/latest/graalvm-jdk-17_linux-x64_bin.tar.gz

          解压至指定目录,并配置环境变量

    tar -zxvf   graalvm-jdk-17_linux-x64_bin.tar.gz

          测试环境

  java -version

  gu  list

        出现上面信息说明环境可行

2、gradle安装

        官网地址:Gradle | Thank you for downloading Gradle!

    wget  https://services.gradle.org/distributions/gradle-8.8-bin.zip

      下载好解压到指定目录(如果在线无法下载,离线下载上传至远程服务器),配置好环境变量,验证环境可用否

3、编译源码

       这里为了便于演示,直接将win开发号的源码上传服务器,企业级应用可以使用jeknis自动化部署工具。 进入到项目根目录:

    cd  boot3-app

 

  (1) 构建jar包

    ./gradlew  clean  &&  ./gradlew  graalvm-app:build

         构建成功如上图所示,进入到build目录既可以看到打好的jar

     ls  graalvm-app/build/libs/

       我们的目标不是打jar包,提前做一次jar包构建,把所需的依赖提下载好,提高native构建的成功率。

(2)native构建

        由于native构建需要依赖gcc编译器,提前检查gcc编译器知否安装,如果未安装,执行下面命令安装:

    yum  install -y  gcc

    yum install zlib-devel

        native-image编译可执行文件

 ./gradlew  graalvm-app:nativeBuild

        构建时间比较长,大概耗时6分钟

        构建好的可执行程序在build/native/nativeCompile

   ls graalvm-app/build/native/nativeCompile/

 

      graalvm-app就是通过native-image打包的最终可执行程序,控制台直接启动

 ./graalvm-app

      验证服务可用性

### 使用 GraalVM 将 Spring Boot 应用程序打包成本地可执行文件 #### 安装和配置 GraalVM 为了使用 GraalVM 打包 Spring Boot 应用程序,首先需要安装并配置 GraalVM 环境。进入官方下载页面获取适用于 Windows 11 的版本,并按照说明完成解压缩操作[^1]。 接着设置环境变量以便命令行工具能够识别到 GraalVM- `GRAALVM_HOME` 设置为 GraalVM 解压后的根目录路径。 - 更新系统的 PATH 变量,加入 `%GRAALVM_HOME%\bin`。 验证安装成功与否可以通过运行如下命令来确认: ```bash gu --version ``` 这一步骤确保了后续构建过程中所需的 Native Image 工具链可用。 #### 准备 Spring Boot 项目 创建一个新的或打开现有的基于 Spring Boot 3.x 版本的应用程序。考虑到 AOT (Ahead-of-Time Compilation) 支持可以显著提升性能表现,建议利用这一特性优化应用结构。 在项目的 pom.xml 文件中添加必要的依赖项以支持本地镜像编译功能以及任何其他所需插件: ```xml <dependency> <groupId>org.springframework.experimental</groupId> <artifactId>spring-aot-maven-plugin</artifactId> <version>${aot.version}</version> </dependency> <!-- 添加 native-image 插件 --> <build> ... <plugins> <plugin> <groupId>org.graalvm.buildtools</groupId> <artifactId>native-maven-plugin</artifactId> <!-- 配置参数省略 --> </plugin> </plugins> </build> ``` 上述 XML 片段展示了如何引入 Maven 插件用于处理提前编译逻辑和服务于生成原生映像的任务。 #### 编写应用程序代码 编写业务逻辑部分时需要注意某些反射调用可能不被完全兼容;因此尽可能采用静态方法或者通过代理模式间接访问动态组件。对于那些不可避免的情况,则需显式声明保留这些类及其成员免受修剪机制的影响。 例如,在 application.properties 中指定要保持的类列表: ```properties graalvm.native.reflection-config=classpath:/META-INF/native-image/**/reflect.json ``` 同时提供相应的 JSON 文件定义具体规则。 #### 构建本地可执行文件 一切准备就绪之后,就可以着手进行最终步骤——实际构建过程。此阶段涉及两个主要环节:一是常规的 Java 字节码编译,二是转换为目标平台上的机器指令集表示形式。 执行以下 Maven 命令触发整个流程: ```bash mvn clean package -Pnative ``` 该选项会自动激活之前提到过的 native-profile 并启动完整的构建管线直至产出目标产物为止。 一旦顺利完成以上所有工作,将会得到一个独立的 .exe 文件作为输出成果物,可以直接分发给终端用户而无需额外携带 JVM 或者解释器环境。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值