使用GraalVM 构建 Spring Boot 3.0 原生可执行文件

news2024/9/27 7:24:07

GraalVM 介绍

既然是VM,那肯定也是一个虚拟机,那它跟JVM有关系吗?有一定关系,GraalVM 可以完全取代上面提到的那几种虚拟机,比如 HotSpot。把你之前运行在 HotSpot 上的代码直接平移到 GraalVM 上,不用做任何的改变,甚至都感知不到,项目可以完美的运行。但是 GraalVM 还有更广泛的用途,不仅支持 Java 语言,还支持其他语言。这些其他语言不仅包括嫡系的 JVM 系语言,例如 Kotlin、Scala,还包括例如 JavaScript、Nodejs、Ruby、Python 等,如图。
在这里插入图片描述

GraalVM Native Image 介绍

GraalVM Native Image 是GraalVM 提供的一种能够将Spring Boot 程序打包成云原生可执行文件的技术,并且比JVM 占用更少的内存和更快的启动速度,非常适合使用容器部署和在Faas平台使用。
与在JVM运行的应用程序不同,GraalVM Native Image需要提前对代码进行编译处理才能创建可执行文件,GraalVM Native Image 的运行不需要提供JVM虚拟机。

GraalVM 文档地址:https://www.graalvm.org/latest/docs/getting-started/
GraalVM Native Image 文档地址:https://www.graalvm.org/latest/reference-manual/native-image/

创建第一个GraalVM云原生应用程序

有两种办法创建原生应用程序:

  • 使用Cloud Native Buildpacks 来生成一个包含可执行应用程序的轻量级容器
  • 使用GraalVM Native 构建工具生成一个可执行文件

下面示例使用GraalVM Native来构建。

环境准备

安装GraalVM SDK

压缩包安装

下载对应版本软件:
https://github.com/graalvm/graalvm-ce-builds/releases

  • Windows
  1. 解压ZIP包到安装目录
  2. 配置path路径到GraalVM 的bin目录

setx /M PATH “C:\Progra~1\Java<graalvm>\bin;%PATH%”

  1. 配置JAVA_HOME到GraalVM 的安装目录

setx /M JAVA_HOME “C:\Progra~1\Java<graalvm>”

  1. 重启,测试

在这里插入图片描述

  • Linux
  1. 解压ZIP包到指定目录

tar -xzf graalvm-ce-java-linux--.tar.gz

  1. 配置PATH路径

export PATH=/path/to//bin:$PATH

  1. 配置JAVA_HOME路径

export JAVA_HOME=/path/to/

  1. 测试
  • MAC
  1. 解压ZIP包

tar -xzf graalvm-ce-java-darwin-amd64-.tar.gz

如果使用的是macOS Catalina更高版本,可能需要执行如下命令:
sudo xattr -r -d com.apple.quarantine /path/to/graalvm

  1. 移动解压的包到/Library/Java/JavaVirtualMachines

sudo mv graalvm-ce-java- /Library/Java/JavaVirtualMachines

验证是否成功:/usr/libexec/java_home -V 将会得到一个安装的JDK目录

  1. 配置PATH路径

export PATH=/Library/Java/JavaVirtualMachines//Contents/Home/bin:$PATH

  1. 配置JAVA_HOME路径

export JAVA_HOME=/Library/Java/JavaVirtualMachines//Contents/Home

IDEA 安装

使用IDEA内置功能即可,下载有点慢,这边IDEA只有基于Java 19 的版本

在这里插入图片描述

使用IDEA 下载后,只能在IDEA内部运行应用程序,如果要使用maven 打包,还需要配置PATHJAVA_HOME路径,同压缩包安装方式

安装Native Image 工具

如果没有安装该工具,maven 在打包的时候会自动下载,但建议提前安装打包工具

gu install native-image

在这里插入图片描述

安装Native Image依赖的本地环境

因为要编译成指定本地可执行文件,比如exe,需要Windows安装了Microsoft Visual C++ (MSVC),
MAC 需要安装xcode,通过xcode-select --install,
Linux sudo yum install gcc glibc-devel zlib-devel
Ubuntu sudo apt-get install build-essential libz-dev zlib1g-dev
其他Linux sudo dnf install gcc glibc-devel zlib-devel libstdc++-static

这里以Windows为例,安装 Visual Studio 2017 或更高版本的 构建工具和 Windows 10 SDK

使用start.spring.io创建一个Spring Boot 3.0应用

1、选择Java 17 版本
2、选择GraalVM Native Support、Spring Web

在这里插入图片描述

创建后的pom.xml

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.0.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>graalvm-native-application</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>graalvm-native-application</name>
    <description>graalvm-native-application</description>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.graalvm.buildtools</groupId>
                <artifactId>native-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

3、写一个简单的接口

package com.example.graalvmnativeapplication;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@SpringBootApplication
public class GraalvmNativeApplication {

    public static void main(String[] args) {
        SpringApplication.run(GraalvmNativeApplication.class, args);
    }

    @RequestMapping("/")
    String home() {
        return "Hello World!";
    }

}

4、打包可执行文件
在 安装VS 中找到 x64 Native Tools Command Prompt 执行如下命令

mvn -Pnative native:compile

一共7个步骤,花费了差不多2分钟打包完,生成的可执行文件在target目录

在这里插入图片描述
5、运行可执行文件
双击exe文件,Spring Boot 应用程序几乎瞬间启动完毕,文件大小有68M,对于一个没什么业务代码的demo来说,确实太大了。

在这里插入图片描述

访问地址http://localhost:8080/,能正常访问。

在这里插入图片描述
6、与Java 17 比较

VM包大小启动时间
GraalVM68M0.15s
Java 1718M2.15s
Java 816.5M3.5s

从这个DEMO看出,使用GraalVM Spring Boot 的启动时间确实快乐很多,但同时包也大了很多 ,有点空间换时间的意思。如果要打包原生可执行文件的话,环境配置也比较繁琐。不过使用GraalVM 来替代JVM 跑Java 程序还是很值得尝试的。

参考资料:

  1. https://www.graalvm.org/latest/docs/getting-started/windows/ (GraalVM在 Windows的使用)
  2. https://blog.csdn.net/q412086027/article/details/113878426 (给了我启发)
  3. https://medium.com/graalvm/using-graalvm-and-native-image-on-windows-10-9954dc071311 (比较清楚的Windows 配置步骤)

作者其他文章:
Grafana 系列文章,版本:OOS v9.3.1(更新中)

  1. Grafana 的介绍和安装
  2. Grafana监控大屏配置参数介绍(一)
  3. Grafana监控大屏配置参数介绍(二)
  4. Grafana监控大屏可视化图表

Spring Boot Admin 2 系列文章:

  1. Spring Boot Admin 参考指南
  2. SpringBoot Admin服务离线、不显示健康信息的问题
  3. Spring Boot Admin2 @EnableAdminServer的加载
  4. Spring Boot Admin2 AdminServerAutoConfiguration详解
  5. Spring Boot Admin2 实例状态监控详解
  6. Spring Boot Admin2 自定义JVM监控通知
  7. Spring Boot Admin2 自定义异常监控
  8. Spring Boot Admin 监控指标接入Grafana可视化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/97432.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【GRU回归预测】基于麻雀算法优化门控循环单元SSA-GRU神经网络实现多输入单输出回归预测附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

java秋招被问到的八股文

投递的岗位是Java后端开发&#xff0c;八股文背了很多&#xff0c;现在面过三十场&#xff0c;做一个总结&#xff0c;整理出一些我确实被问到的问题。 该准备什么 首先是简历里的项目&#xff0c;一定要好好整理&#xff0c;项目的架构是怎样的&#xff0c;开发过程中遇到的…

国产实时操作系统+intel x86/龙芯平台超边缘计算机方案

引言 近年来&#xff0c;物联网、云计算、机器学习和网络安全等技术不断推动工业 4.0 的发展&#xff0c;“云边端” 的架构正逐步替代 “云管端”&#xff0c;边缘计算成为新时代许多领域转型的关键要素。以智能制造为例&#xff0c;不同于为互联网服务的 CDN 边缘计算技术&a…

Spring(二):Spring的创建和使用

目录一、创建Spring项目1.1 创建一个Maven项目1.2 添加Spring框架支持1.3 创建启动类二、使用Spring存储对象2.1 创建Bean2.2 将Bean注册到容器三、获取并使用Bean对象3.1 创建Spring的上下文3.2 从Spring上下文对象中取出Bean对象3.3 使用Bean一、创建Spring项目 1.1 创建一个…

传统数据治理的常见陷阱有哪些?

一、传统的数据治理 传统的数据治理是一种数据优先的治理方法。这种传统方法缺乏响应数据用户需求的流动性——或者在新法规出现时适应新法规的灵活性。传统方法概述角色、创建数据标准、分配责任并创建公司范围的数据策略。因为它强调对数据的控制&#xff0c;这种方法威胁工…

Java程序接入ChatGPT

Java程序接入ChatGPT0 前言1 还想体验的小伙伴可以试试2 Java接入前准备3 官方支持接入语言4 调用费用5 接口调用说明6 代码实现6.1 postman调用6.2 Java调用7 小结0 前言 之前文章中我们聊过怎么注册使用最近很火的ChatGPT&#xff1f;这期我们来看看怎么在Java中调用ChatGPT…

openssl aes加密例子

openssl OpenSSL 是一个安全套接字层密码库&#xff0c;囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议&#xff0c;并提供丰富的应用程序供测试或其它目的使用。 首先&#xff0c;要安装 openssl: centos命令: sudo yum install openssl-devel ubuntu命令&#x…

重学webpack系列(一) -- 前端模块化的演变历史

前言 任何事物的产生都有他的必然性&#xff0c;就像是冥冥之中注定了一样&#xff0c;在JavaScript刀耕火种的时代&#xff0c;前端是被定义为切图的一项工作&#xff0c;页面逻辑与交互全部由服务端工程师完成&#xff0c;前端开发几乎不受服务端开发重视&#xff0c;那时候…

免费教你如何设计商品主图,手把手教学!

好看的电商主图都是怎么设计出来的&#xff1f;有什么办法能快速设计出爆款的同款商品主图吗&#xff1f;跟着小编的教学步骤&#xff0c;教你轻松在线设计&#xff0c;不需要任何门槛也能掌握的电商设计工具&#xff0c;轻松搞定各种类型的商品主图&#xff0c;下面跟着小编的…

Spring BOOT 手写一个starter并使用这个starter

1、stater工程的命名 starter 是一个开箱即用的组件&#xff0c;减少不必要的重复代码&#xff0c;重复配置。例如&#xff0c;在mavne项目进行配置的时候&#xff0c;我们需要引用 spring-boot-starter-parent。 Spring 官方定义的 starter 通常命名遵循的格式为 spring-bo…

Linux——日志管理

基本介绍 日志文件是重要的系统信息文件&#xff0c;其中记录了许多重要的系统事件&#xff0c;包括信息的登录信息、系统的启动信息、系统的安全信息、邮件相关信息、各种服务相关信息等&#xff1b;日志对于安全来说也很重要&#xff0c;它记录了系统每天发生的各种事情&…

ASP.NET Core —选项系统

ASP.NET Core — 选项系统1. 选项2. 选项配置方式2.1 手动绑定2.2 依赖注入配置2.2.1 配置文件节点转换选项2.2.1 硬编码配置选项2.2.3 使用DI服务配置选项2.2.4 命名选项2.2.4 后期配置3. 使用3.1 IOptions<TOptions>3.2 IOptionsMonitor<TOptions>3.3 IOptionsSn…

零基础小白:为什么要学习编程?如何入门编程?!

这篇文章回答以下几个问题&#xff1a; ★我们为什么要学习编程&#xff1f; ★非计算机学生&#xff0c;如何对编程产生兴趣&#xff1f; ★零基础&#xff0c;如何入门编程&#xff1f; 第一个问题&#xff1a;我们为什么要学习编程&#xff1f; 如果说和编程有关的最经常收…

QT mysql 数据库的使用

1.首先我是用的是 网上的免费的mysql 数据库 &#xff0c; 1.申请步骤 2.链接 &#xff1a;SQLPub - 免费的MySQL数据库 2..测试数据库是否可以使用 头文件&#xff1a; #include <QSqlDatabase>//数据库 #include <QDebug>//输出 #include <QStringList&g…

【原创】Unity结合OpenAI官方api实现类似chatGPT的AI聊天机器人

一、什么是ChatGPT 最近chatGPT爆火&#xff0c;网络铺天盖地的各种文章视频&#xff0c;各种牛逼之声。倒算不上第一时间使用&#xff0c;发布隔了一周多&#xff0c;才从同事那里听说了这么个神奇的技术。这周阳了&#xff0c;持续发烧在家&#xff0c;忙着养病也没时间去了解…

[oeasy]python0030_设置路径_export_PATH_zsh_系统路径设置_export

放入路径 回忆上次内容 我们要在任意路径下直接执行 sleep.py 把 sleep.py 放在 /usr/bin/ 下面最终可以在任意位置执行程序sleep.py 但是 /usr/bin 里面放的一般都是二进制命令文件命令实在是太多太乱最终还是删除了sleep.py 我想 把宿主目录添加到系统变量 $PATH 中这样有可…

winform中使用SqlSugar和SQLite

winform虽然是老古董了&#xff0c;但是在开发桌面方面&#xff0c;还是得心应手的&#xff0c;比如开发一个小工具&#xff0c;小demo之类的。接下来&#xff0c;我们使用SqlSugar和SQLite数据库&#xff0c;在winform中运用。 1.首先建立一个程序 2.安装 System.Data.SQLite…

宿舍管理系统的设计与实现

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 1登录&#xff1a;学生进行用户登陆密码核对&#xff0c;并可对自己的信息进行修改。 2.宿舍水电费管理&#xff1a;学生…

CloudCompare配置介绍

和前面系列博客一样&#xff0c;咱们还是从官网介绍先去了解新东西。官网网址如下&#xff1a; CloudCompare - Open Source project 顶部菜单中提供了下载&#xff0c;手册查找入口&#xff0c;github路径如下&#xff1a; GitHub - CloudCompare/CloudCompare: CloudCompar…

想辞职转行做程序员,需要学习哪些内容?

第一步&#xff0c;还是要明确具体的职业方向。 程序员是个统称&#xff0c;写代码的都叫程序员&#xff0c;但Java程序员&#xff0c;或是Python程序员&#xff0c;这才是职业。就好像很多大学生&#xff0c;专业是软件工程&#xff0c;这玩意儿并不是职业&#xff0c;学的内…