graalvm编译springboot3 native应用

2024-06-13 10:04

本文主要是介绍graalvm编译springboot3 native应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

         云原生时代容器先行,为了更好的拥抱云原生,spring boot3之后,推出了graalvm编译boot项目,利用jvm的AOT( Ahead Of Time )运行前编译技术,可以将javay源码直接构建成机器码二进制的文件,无需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'repositories {maven { url 'https://maven.aliyun.com/repository/central/' }maven { url 'https://maven.aliyun.com/repository/public/' }mavenCentral()
}

(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 -versiongu  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  gccyum 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编译springboot3 native应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1056985

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

springboot3打包成war包,用tomcat8启动

1、在pom中,将打包类型改为war <packaging>war</packaging> 2、pom中排除SpringBoot内置的Tomcat容器并添加Tomcat依赖,用于编译和测试,         *依赖时一定设置 scope 为 provided (相当于 tomcat 依赖只在本地运行和测试的时候有效,         打包的时候会排除这个依赖)<scope>provided

zoj3820(树的直径的应用)

题意:在一颗树上找两个点,使得所有点到选择与其更近的一个点的距离的最大值最小。 思路:如果是选择一个点的话,那么点就是直径的中点。现在考虑两个点的情况,先求树的直径,再把直径最中间的边去掉,再求剩下的两个子树中直径的中点。 代码如下: #include <stdio.h>#include <string.h>#include <algorithm>#include <map>#

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

AI行业应用(不定期更新)

ChatPDF 可以让你上传一个 PDF 文件,然后针对这个 PDF 进行小结和提问。你可以把各种各样你要研究的分析报告交给它,快速获取到想要知道的信息。https://www.chatpdf.com/

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝