Spring boot 3 GraalVM Native Image

news2024/11/24 19:34:10

Spring boot 3 && GraalVM Native Image

什么是 GraalVM?

GraalVM is a high-performance JDK designed to accelerate the execution of applications written in Java and other JVM languages while also providing runtimes for JavaScript, Python, and a number of other popular languages. GraalVM offers two ways to run Java applications: on the HotSpot JVM with Graal just-in-time (JIT) compiler or as an ahead-of-time (AOT) compiled native executable. GraalVM’s polyglot capabilities make it possible to mix multiple programming languages in a single application while eliminating foreign language call costs.

GraalVM是一个高性能的JDK,旨在加速用Java和其他JVM语言编写的应用程序的执行,同时也为JavaScript、Python和许多其他流行语言提供运行时。GraalVM提供了两种运行Java应用程序的方法:在HotSpot JVM上使用Graal实时(JIT)编译器或作为提前(AOT)编译的本地可执行文件。GraalVM的多语言功能使得在一个应用程序中混合多种编程语言成为可能,同时消除了外部调用成本。

GraalVM 架构

在这里插入图片描述

什么是 GraalVM Native Image?

GraalVM Native Images是独立的可执行文件,可以通过提前处理编译的Java应用程序来生成。本机映像通常比JVM映像占用的内存更少,启动速度更快。真的很快

Spring boot 3 & GraalVM Native Image

Windows 版本

Windows 10 22H2
下载需要的包,否则后面 java maven 编译会报错
通过微软WDK网址下载相关的软件

  • visual studio
    visual studio 2019 版本 (估计2022也可以)
    工作负荷-通用 Windows 平台开发

  • 安装 WDK
    适用于 Windows 10 版本 2004 的 WD

以上2个耗时较长。

  • 安装docker desktop

环境变量 一定要设置,否则使用mvn native:compile 编译时可能出现 cl.exe 找不到, 也会报 fatal error C1083: 无法打开包括文件: “stdio.h ”: No such file or directory]

MSVC_HOME=C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30133
WK10_BIN_HOME=C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0
WK10_INCLUDE_HOME=C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0
WK10_LIB_HOME=C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0
INCLUDE=%WK10_INCLUDE_HOME%\ucrt;%WK10_INCLUDE_HOME%\um;%WK10_INCLUDE_HOME%\shared;%MSVC_HOME%\include;
LIB=%WK10_LIB_HOME%\um\x64;%WK10_LIB_HOME%\ucrt\x64;%MSVC_HOME%\lib\x64;
#此处追加
Path=%MSVC_HOME%\bin\HostX64\x64;%WK10_BIN_HOME%\x64

创建一个springboot 工程

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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.0.0</version>
        <relativePath/>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>pr.iceworld.fernando</groupId>
    <artifactId>spring-boot3-graavm-image</artifactId>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

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

    <!-- repository -->
    <repositories>
        <repository>
            <id>spring-snapshots</id>
            <url>https://repo.spring.io/snapshot</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
        <repository>
            <id>spring-milestones</id>
            <url>https://repo.spring.io/milestone</url>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>spring-snapshots</id>
            <url>https://repo.spring.io/snapshot</url>
        </pluginRepository>
        <pluginRepository>
            <id>spring-milestones</id>
            <url>https://repo.spring.io/milestone</url>
        </pluginRepository>
    </pluginRepositories>

    <profiles>
        <profile>
            <id>native</id>
        </profile>
    </profiles>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <mainClass>pr.iceworld.fernando.springboot3.image.MainApplication</mainClass>
                    <image>
                        <!-- 如果不指定,默认builder 是 tiny 版本,无法使用 docker run 运行 -->
                        <builder>paketobuildpacks/builder:base</builder>
                    </image>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
@RestController
//@SpringBootApplication
//@SpringBootConfiguration
@EnableAutoConfiguration
//@ComponentScan
public class MainApplication {

    @RequestMapping("/")
    String home() {
        return "Hello It's me!";
    }

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

编译工程并打包

mvn -Pnative native:compile 

在这里插入图片描述
spring-boot3-graavm-image.exe 可以直接执行,且加载很快,很快
···
2022-12-12T23:51:15.726+08:00 INFO 1224 — [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 69 ms
2022-12-12T23:51:15.750+08:00 INFO 1224 — [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ‘’
2022-12-12T23:51:15.750+08:00 INFO 1224 — [ main] p.i.f.springboot3.image.MainApplication : Started MainApplication in 0.105 seconds (process running for 0.111)
···

C:\Users\ferna>curl localhost:8080
Hello It's me!

打包一个docker 镜像

mvn -Pnative spring-boot:build-image

REPOSITORY                  TAG        IMAGE ID       CREATED        SIZE
paketobuildpacks/run        base-cnb   3e3acccbaa17   4 days ago     88.8MB
paketobuildpacks/run        tiny-cnb   6cfe3de75423   4 days ago     17.3MB
spring-boot3-graavm-image   3.0.0      9b7b85e90f52   42 years ago   167MB
paketobuildpacks/builder    base       0593f8ae856c   42 years ago   1.35GB
paketobuildpacks/builder    <none>     215b9051b4b1   42 years ago   597MB
paketobuildpacks/builder    tiny       7841a1c811a3   42 years ago   590MB
docker run --rm -p 8080:8080 spring-boot3-graavm-image:3.0.0
C:\Users\ferna>curl localhost:8080
Hello It's me!

Linux 版本

TODO

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

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

相关文章

Seata模式-tcc

Seata模式目录概述需求&#xff1a;设计思路实现思路分析1.tcc模式2.一阶段 prepare 行为参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,c…

qiankun 部署微前端-vue2 (二)

对于基本的部署问题&#xff0c;也可以去官网查找答案&#xff1a; 常见问题 - qiankun 这里主要记录在部署过程中遇到的问题 一、路由权限问题 无论主应用路由还是子应用中的路由&#xff0c;都会涉及权限问题&#xff0c;并不是每个路由路径对任何角色都是可见&#xff0…

Linux学习-83-MySQL安装过程

17.12 MySQL安装 作为LAMP架构的后端&#xff0c;是一款流行的开源关系数据库系统。在企业网站、业务系统等应用中&#xff0c;各种账户信息、产品信息&#xff0c;客户资料、业务数据等都可以存储到MySQL数据库&#xff0c;其他程序可以通过SQL语句来查询&#xff0c;更改这些…

〖产品思维训练白宝书 - 产品思维认知篇①〗- 产品思维能够为我们带来多大的价值?

大家好&#xff0c;我是 哈士奇 &#xff0c;一位工作了十年的"技术混子"&#xff0c; 致力于为开发者赋能的UP主, 目前正在运营着 TFS_CLUB社区。 &#x1f4ac; 人生格言&#xff1a;优于别人,并不高贵,真正的高贵应该是优于过去的自己。&#x1f4ac; &#x1f4e…

算法竞赛入门【码蹄集进阶塔335题】(MT2026-2050)

算法竞赛入门【码蹄集进阶塔335题】(MT2026-2050&#xff09; 文章目录算法竞赛入门【码蹄集进阶塔335题】(MT2026-2050&#xff09;前言为什么突然想学算法了&#xff1f;为什么选择码蹄集作为刷题软件&#xff1f;目录1. MT2026 二维坐标点移动2. MT2027 一秒成零3. MT2028 小…

开关量转4G模块直接阿里云操作介绍

开关量转4G模块直接阿里云操作介绍首先&#xff0c;设备接入阿里云阿里云的连接 同上&#xff0c;配置阿里云平台参数前&#xff0c;和华为云一样&#xff0c;首先要在阿里云控制台创建产品&#xff0c;添加设备获取设备证书 上云流程&#xff1a;创建产品--添加设备--获取证书…

USACO简介

USACO是美国信息学奥赛官网&#xff0c;网站为&#xff1a;USACO 其中还包括USACO TRAINING题目&#xff0c;这是一个可以做练习的网站&#xff0c;网站为USACO Training Gateway 进入USACO网站&#xff0c;我们可以看到以下图片 下来简要说一下关于USACO的注意事项 1.USACO…

python-(6-5-3)爬虫---处理防盗链获取视频

文章目录一 需求二 分析1 拿到contId2 拿到video_status返回的json -----> src Url3 对src Url 进行修整4 下载资源三 代码一 需求 想要获得某处的视频资源&#xff0c;但由于防盗链的存在&#xff0c;使得在使用浏览器的开发页面获得的视频地址与我们实际获取的地址产生差…

Spring源码深度解析十四:@Aspect方式的AOP上篇 - @EnableAspectJAutoProxy

一、前言 文章目录&#xff1a;Spring源码深度解析&#xff1a;文章目录 二、简介 Aop 即面向切面编程&#xff0c;而 Aspect 是Aop 思想的一种实现。 并不是所有的AOP框架都相同&#xff0c;它们在连接点模型上可能有强弱之分&#xff0c;有些允许在字段修饰符级别的应用通…

分享a股下单接口执行买入操作的流程代码

用户在使用a股下单接口&#xff0c;能够得到更多更准确的信息&#xff0c;让用户在股市当中&#xff0c;操作起来更加便捷和有效&#xff0c;对股市市场行情动向判断更加的准确一些。 下面看一下a股下单接口是如何执行买入操作的功能&#xff1a; std::cout << " …

小程序批发订货怎么做

小程序订货系统 批发订货是每个生产企业都不少不了的一个环节&#xff0c;伴随着信息化技术的不断更新&#xff0c;传统的订货方式已经不能满足生产企业的需求了&#xff0c;而鲜桥小程序订货系统基于微信生态&#xff0c;让你即买即用&#xff0c;轻松告别传统的订货方式&…

Java解析NC2018-2020降水量格点数据

经纬度范围 lon = 7849;lat = 5146;time = 12;double lon(lon=7849); :long_name = "longitude"; :unit = "degree"; double lat(lat=5146); :long_name = "latitude"; :unit = "degree"; double time(time=12); :long_nam…

【论文】Holistically-Nested Edge Detection

文章目录Development of Edge DetectionMulti-scale learning structureLoss FunctionNetwork Architecture&#x1f4c4;&#xff1a;Holistically-Nested Edge Detection&#x1f517;&#xff1a;https://openaccess.thecvf.com/content_iccv_2015/html/Xie_Holistically-Ne…

DSP篇--C6701功能调试系列之SRAM、ADC、喂狗测试

目录 1、SRAM测试 1.1 SRAM读写功能测试 1.2 EDAC测试 2、ADC测试 3、DSP喂狗测试 调试的前期准备可以参考前面的博文&#xff1a;DSP篇--C6701功能调试系列之前期准备_nanke_yh的博客-CSDN博客https://blog.csdn.net/nanke_yh/article/details/128277631 1、SRAM测试 1…

国税局验证码识别 识别不了我还不能input吗

前言 最近接到一个需求&#xff0c;就是在国税局的网页中输入 【发票代码】、【*发票号码】、【*开票日期】、【*开具金额(不含税)】、【*验证码】 然后将此发票进行下载&#xff0c;但是【验证码】真的是拦路虎啊&#xff0c;我也查询了好多大佬的论文&#xff0c;有的是通过J…

OTP语音芯片ic的工作原理,以及目前的现状和技术发展路线是什么?flash型

目录 otp工艺和flash工艺的区别和概念 衡量一个芯片的成本&#xff0c;简单可以归结为3个方面 芯片的生产工艺&#xff0c;比如OTP的工艺都是100nm左右的工艺、8寸晶圆&#xff0c;很便宜。并且OTP的技术需要光刻机光照的次数少&#xff0c;所以生产起来快&#xff0c;这样无…

openCV实战项目--人脸考勤

人脸任务在计算机视觉领域中十分重要&#xff0c;本项目主要使用了两类技术&#xff1a;人脸检测人脸识别。 代码分为两部分内容&#xff1a;人脸注册 和 人脸识别 人脸注册&#xff1a;将人脸特征存储进数据库&#xff0c;这里用feature.csv代替人脸识别&#xff1a;将人脸特…

【云计算与大数据技术】数据编码LZSS算法、Snappy压缩库及分布式通信系统的讲解(图文解释 超详细)

一、数据编码概述 数据编码概述 - 在分布式系统中需要处理大量的网络数据,为了加快网络数据的传输速度,通常需 要对传输数据进行编码压缩 数据压缩是以尽可能少的数码来表示信源所发出的信号&#xff0c;减少容纳给定的消息集合或数据采样集合的信号空间&#xff0c;这里讲的…

Linux安装Maven

目录 1.下载安装包 2.解压Maven 3.添加环境变量 4.检测Maven是否搭建成功 5. 编辑 Maven的settings.xml文件 5.1设置本地仓库 5.2添加阿里云镜像 1.下载安装包 访问查看需要的版本&#xff1a;Index of /dist/maven (apache.org) 安装包统一存放到/opt/software目录下…

Java基于springboot校园德育活动预约和评分管理系统+vue+elementUI

本系统结合计算机系统的结构、概念、模型、原理、方法&#xff0c;在计算机各种优势的情况下&#xff0c;采用JAVA语言&#xff0c;结合SpringBoot框架与Vue框架以及MYSQL数据库设计并实现的。本校园德育活动预约和评分管理系统主要包括个人中心、学生管理、活动信息管理、活动…