代码编织梦想

graalvm官方文档

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

GraalVM 介绍

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

GraalVM Native Image 介绍

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

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

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

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

下面示例使用GraalVM Native来构建,java版本为17。

windows 安装GraalVM SDK

下载地址:https://github.com/graalvm/graalvm-ce-builds/releases/tag/vm-22.3.1

在这里插入图片描述
下载完成,然后解压。

配置环境变量

在这里插入图片描述
变量值就是 graalvm的安装目录
在这里插入图片描述
验证安装成功没有。

java -version
D:\IdeaProjects\mytools\chatgpt>java -version
openjdk version "17.0.6" 2023-01-17
OpenJDK Runtime Environment GraalVM CE 22.3.1 (build 17.0.6+10-jvmci-22.3-b13)
OpenJDK 64-Bit Server VM GraalVM CE 22.3.1 (build 17.0.6+10-jvmci-22.3-b13, mixed mode, sharing)

D:\IdeaProjects\mytools\chatgpt>

安装Native Image 工具

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

gu install native-image

由于在线安装很慢可以使用离线安装。

  1. 先去github下载native-image,下载地址:https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.3.1/native-image-installable-svm-java17-windows-amd64-22.3.1.jar

在这里插入图片描述
2. 安装命令

gu install -L  C:\Users\zhubayi\Downloads\native-image-installable-svm-java17-linux-amd64-22.3.1.jar

注意:-L 后面就是native-image文件的路径

3.查看安装成功没有

gu list 
C:\Users\zhubayi>gu list
ComponentId              Version             Component name                Stability                     Origin
---------------------------------------------------------------------------------------------------------------------------------
graalvm                  22.3.1              GraalVM Core                  Supported
native-image             22.3.1              Native Image                  Early adopter                 github.com

安装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 2022 或更高版本的 构建工具和 Windows 10 SDK
可以参考我这篇博客:https://blog.csdn.net/qq_44732146/article/details/128877510

使用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.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.zhubayi</groupId>
    <artifactId>graalvm-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>graalvm-demo</name>
    <description>graalvm-demo</description>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <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、写一个简单的controller

@RestController
public class TestController {
    @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/,能正常访问

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_44732146/article/details/129631186

向云原生靠近 | 体验 GraalVM 静态编译字节码,尝试 “超声波 Java” - Quarkus-爱代码爱编程

本人资历、水平有限,如有错误请大佬们批评指正,谢谢! 你身边的项目架构云原生吗,还是只是云却不原生? Java 能够像 C、Go 等语言一样做静态编译吗?如果能,会对现有架构造成什么样的影响? 因 JVM 的短板,相关技术栈对于云原生架构来说不是一个很好的选择,难道 JVM 在云原生架构方面只能被后浪们蚕食吗? 文章目录 前

springboot3.0正式发布,我来尝尝鲜_java序码的博客-爱代码爱编程_springboot3.0

GraalVM 版本:graalvm-ce-java17-22.3.0 SpringBoot3.0 中最重要的特性就是对 GraalVM 的支持,从而达到更快的启动速度,有两种使用方式。 利用 GraalVM 构建可执行文件 因为需要利用 GraalVM 来打包可执行文件,所以需要你的机器上安装了 GraalVM。 新建一个

graalvm安装配置与springboot3.0尝鲜_fate _zore的博客-爱代码爱编程_graalvm落地springboot

Graalvm安装配置与springboot3.0尝鲜 Spring 团队一直致力于 Spring 应用程序的原生映像支持已有一段时间了。经过3 +年的孵化春季原生Spring Boot 2 的实验性项目,原生支持将

springboot3.x原生镜像-爱代码爱编程

前提 Spring团队致力于为Spring应用程序提供原生映像支持已经有一段时间了。在SpringBoo2.x的Spring Native实验项目中酝酿了3年多之后,随着Spring Framework 6和Spring Boot 3的发布,对应的项目就是Spring Native,原生镜像支持将会发布GA版本(换言之就是,Native Imag

springboot 3.0正式发布,有这几个新变化!-爱代码爱编程

点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏  原创 | Java 2021 超神之路,很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框架 Netty 源码解析消息中间件 RocketMQ 源码解析

一篇文章让你学会spring-爱代码爱编程

Spring6 1、概述 1.1、Spring是什么? Spring 是一款主流的 Java EE 轻量级开源框架 ,Spring 由“Spring 之父”Rod Johnson 提出并创立,其目的是用于简化 Java

windows环境下策略模式与java界面布局_java win界面-爱代码爱编程

我是荔园微风,作为一名在IT界整整25年的老兵,今天总结一下Windows环境下策略模式与Java界面布局的问题。 不知道大家有没有这样的感觉,看了一大堆编程和设计模式的书,却还是很难理解设计模式,无从下手。为什么?因为你看的都是理论书籍。 我今天就在Windows操作系统上安装好J