Graalvm编译spring boot 3 + jpa 的原生镜像

news2024/9/28 15:18:48

编译spring boot 3 native + jpa的原生镜像

其中涉及版本:
maven: 3.5.4
jdk: 17
graalvm: 22.3
springboot + jpa: 3.0.8

一、Windows

1、graalvm安装

GraalVM22.3.0安装地址
GraalVM22.3.0安装地址

解压到任意目录后添加JAVA_HOME环境变量

新增path:%JAVA_HOME%与%JAVA_HOME%\bin

安装成功:

2、安装VisualStudio

安装VisualStudio

必须的选择:

  1. MSVC v143 - VS 2022 c++ x64/x86生成工具 根据你的jdk版本来选,jdk11需要MSVC v140 2015、jdk15需要MSVC v141 2017、jdk17需要MSVC v142 2019、jdk21需要MSVC v143 2022。当然他们向下兼容,如果你运行中出现了问题,尝试更换对应的版本。

  2. Windows 10 SDK 根据你的windows版本选择,如果说windows10就选择win10

将cl.exe的目录添加到path中。该程序在笔者的C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\bin\Hostx64\x86下,请根据自己安装目录去寻找。

3、安装native-image

使用x64 Native Tools Command Prompt for VS 2022 窗口来安装aot编译器native-image。

gu install native-image:该处我已经提前安装。

4、下载spring boot3 native demo

下载demo源码仓库地址spring-native-demo

其中demo中添加了spring-native插件。

<plugin>
 <groupId>org.graalvm.buildtools</groupId>
 <artifactId>native-maven-plugin</artifactId>
</plugin>

springboot3.0配置文件中已经添加了插件依赖,插件的作用就是编译java并且使用操作系统的可执行内核程序进行编译。

5、编译可执行文件

据说在linux和mac中是可以直接使用该插件进行编译,但在windows中,需要使用 x64 Native Tools Command Prompt for VS 2022 窗口进行编译。

我们这里采用比较方便的方式进行 x64 Native Tools Command Prompt for VS 2022 窗口编译,该窗口实际上是使用cmd窗口执行以下目标指令,所以我们只需要在idea中设置shell pathcmd+执行指令就可以直接使用idea的Terminal窗口进行编译了。

配置好后,Terminal中打印native窗口内容,就代表配置成功了。

此时只需要我们执行编译指令mvn install -Pnative native:compile -DskipTests=true,等待后即可编译成功。会在target目录下生成exe可执行文件。

6、执行可执行文件效果

执行exe文件。

在配置了spring data jpamysql数据源的情况下,启动时间很乐观。

二、Linux

1、graalvm安装

下载graalvm linux与native-image的安装jar。

graalvm jdk解压后到任意目录后,将该目录添加到环境变量

vim /etc/profile

source /etc/profile

2、安装gcc

yum install -y gcc

3、安装native-image

使用刚下载的安装包安装native-image

gu -L install native-image-installable-svm-java17-linux-amd64-22.3.0.jar

4、克隆springboot3 native demo,编译可执行文件

git clone https://github.com/wdragondragon/spring-native-demo.git
cd spring-native-demo/
mvn install -Pnative native:compile -X -DskipTests=true</pre>

过程中可能会出现status 137的异常,该异常的出现是编译时内存不足导致oom,请在编辑mvn启动脚本,提高堆内存大小。

发现会使用环境变量MAVEN_OPTS来追加mvn启动的jvm参数。

随后在/etc/profile添加以下内容,source /etc/profile后,再次执行编译。即可编译成功。

5、执行可执行文件效果

编译成功后,target/spring-native-demo为可执行文件,启动可执行文件。配置了jpa的启动速度也十分乐观。

三、可能会出现的异常

在笔者编写该文章时,最新的springboot的ga版本已经是3.1.1了。有可能会有读者会将springboot的版本提升到最新。

但在基于最新GA版本的springboot编译成可执行文件后,启动时会出现以下问题。会导致JpaRepository的interface method派生查询出现动态代理的异常。

可以查看demo中的commit history,其中我尝试过使用-H:DynamicProxyConfigurationFiles指定dynamic-proxy.json来解决,也尝试过引入旧版springboot2.x中的spring-native来申明Hint。但都无济于事。最后在graalvm-reachability-metadata这个子项目中的issue中找到一些蛛丝马迹。

其中感谢derkoe的提醒,我将springboot的版本降低到了上一个GA版本3.0.8,然后再编译十分顺利了。

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

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

相关文章

开发日记-凌鲨中微应用的安全性

凌鲨在框架上使用了特别注重安全性的tauri框架&#xff0c;里面所有的权限都需要明确给出。 微应用本质上是静态web页面加上注入的额外能力。额外能力通过tauri的ipc注入和访问http服务。为了保证主服务的稳定性&#xff0c;一些能力我们是以外挂可执行文件的方式&#xff0c;…

Redis过期策略和持久化机制全面揭秘,教你如何合理配置

Redis过期策略 Redis过期策略就是指Redis如何处理设置了过期时间的键值对。Redis的过期策略有两种&#xff1a;定期删除和惰性删除。 定期删除 定期删除&#xff0c;指的是Redis默认每隔100ms就随机抽取一些设置了过期时间的key&#xff0c;检查是否过期&#xff0c;如果过期…

谈谈mysql——主从模式下的同步方式及半同步、MGR的部署方式

MySQL的复制模式 异步复制 MySQL的复制方式默认是异步的&#xff0c;主从复制涉及三个线程 master I/O master I/O线程负责写入Binlog&#xff0c;并将执行结果返给客户端&#xff0c;至于Binlog有没有被IO线程读取&#xff0c;读取后有没有重放&#xff0c;重放有没有成功&…

Linux系统:OpenSSH7.4p升级到9.0p

目录 一、理论 1.ssh 2.OpenSSH 二、实验 1.OpenSSH升级 三、问题 1.远程SSH服务器拒绝X11转发请求 2.sshd服务重启报错 四、总结 一、理论 1.ssh &#xff08;1&#xff09;概念 ssh 是协议&#xff0c;基于22端口的安全协议。 ssh中文解释是安全的shell&#xff…

使用高斯计需要注意哪些事项

高斯计&#xff08;特斯拉计&#xff09;是检测磁体磁感应强度的专用仪器&#xff0c;可以测量永磁材料的表磁&#xff0c;磁路间隙磁场以及磁场发生装置产生的空间磁场测量。高斯计&#xff08;特斯拉计&#xff09;作为一种比较精密的仪器&#xff0c;在使用过程中应注意以下…

【数据挖掘】推荐系统(一):协同过滤

一、说明 推荐系统是一种计算机程序或算法&#xff0c;用于预测用户对特定项目的兴趣度&#xff0c;并根据这些预测向用户提供个性化推荐。这种系统通常使用大量数据来分析用户的行为和偏好&#xff0c;以找出潜在的喜好和兴趣。推荐系统可以应用于电子商务、社交媒体、影视娱乐…

Java 项目 - SpringBoot+Vue的智慧养老系统

文章目录 1.研究背景2. 技术栈3.系统分析4系统设计4.1 软件功能模块设计4.2数据库设计与实现 5系统详细设计5.1系统功能模块5.2后台登录功能5.2.1管理员功能 源码下载地址 1.研究背景 困扰管理层的许多问题当中,智慧养老平台一定是养老平台不敢忽视的一块。但是管理好智慧养老…

浅浅记录下fortinet vpn链接遇到的一些问题

一、前言 有点问题的win7系统 一、fortinet vpn无法安装问题 说是缺少KB3033929。 首先激活这个系统&#xff0c;怎么激活的这里省略了&#xff0c; 然后下载了一个360修复了一下系统。 二、fortinet vpn安装 刚开始安装的forticlientVPNSetup_7.0.5&#xff0c;安装完成。…

sd卡自动删除的数据如何恢复?数据重获新生的五种方法

用户咨询案例分享&#xff1a; 咨询1&#xff1a;请问SD卡为什么会自动删除里头的文件呀&#xff1f;怎么找回&#xff01;&#xff01;&#xff01; 咨询2&#xff1a;SD卡不知道为什么突然自动删除什么都没有了!还能恢复吗 更多...... 在日常生活中&#xff0c;我们经常使用S…

【电子量产工具】5.页面系统

文章目录 前言一、页面系统分析二、页面数据结构抽象三、底层代码 main_page.c四、页面管理器五、测试程序测试效果总结 前言 最近看了 电子量产工具 这个项目&#xff0c;本专栏是对该项目的一个总结。 一、页面系统分析 页面系统是指在软件应用或网站中&#xff0c;将功能和…

Linux基础服务8——cobbler批量装机

文章目录 一、基本了解1.1 配置文件1.2 数据目录1.3 日志文件1.4 常用命令 二、普通安装2.1 服务端操作2.2 客户端操作 三、定制安装3.1 手动安装3.2 脚本安装&#xff08;推荐&#xff09; 一、基本了解 cobbler简介&#xff1a; Cobbler是一个Linux服务器安装的服务&#xff…

Django_MVT(二)

目录 一、MVT简介 二、M-模型类 1. 定义模型类 2. 迁移 2.1 生成迁移文件命令如下&#xff1a; 2.2 执行迁移命令如下&#xff1a; 3. 数据基础操作 三、V-视图 1.定义视图 2.配置URLconf 访问服务器 四、T-模板 创建模板文件 定义模板 视图调用模板 视图调用模…

vue el-table的每行操作el-button添加单独的loading效果实现

vue el-table的每行操作el-button添加单独的loading效果实现 效果图&#xff1a;实现代码&#xff1a;结语 效果图&#xff1a; 实现代码&#xff1a; <tamplate><el-table :data"list" ><el-table-column fixed"right" label"操作&q…

Application Context的继承关系

Application Context他们关系很复杂&#xff0c;紫色是借口&#xff0c;浅绿色是抽象类&#xff0c;我们要创建继承&#xff0c;要创建实现。第一个class path代表未加载路径&#xff0c;rouces下都是未加载路径.FileSystem代表文件系统&#xff0c;代表则磁盘。 看看文件怎么写…

Gof23设计模式之装饰者模式

1.概述 定义 指在不改变现有对象结构的情况下&#xff0c;动态地给对象增加一些职责&#xff08;即增加其额外功能&#xff09;的模式。 例子 我们先来看一个快餐店的例子。 快餐店有炒面、炒饭这些快餐&#xff0c;可以额外附加鸡蛋、火腿、培根这些配菜&#xff0c;当然加…

抖音seo矩阵源码*开发搭建*代码打包部署(开源)分享

1一、 抖音seo矩阵源码开发搭建&#xff08;支持二开&#xff09;概述 抖音SEO矩阵指的是一系列通过搜索引擎优化&#xff08;SEO&#xff09;技术和策略来提升抖音账号在搜索结果中排名的方法和工具。在抖音上&#xff0c;用户可以通过搜索关键词来查找与其相关的视频和账号…

网络子系统1

网络子系统 1 ISO/OSI和TCP/IP参考模型 国际标准化组织&#xff09;设计了一种参考模型&#xff0c;定义了组成网络的各个层。该模型由7层组成&#xff0c;称为OSI&#xff08;Open Systems Interconnection&#xff0c;开放系统互连&#xff09;模型&#xff0c;如图所示。其…

Android耗电优化需要注意的要点

作者&#xff1a;小墙程序员 在应用开发中&#xff0c;耗电是我们需要关注的重点。但是&#xff0c;开始进行耗电优化时&#xff0c;我们常常感到无从下手。这篇文章将介绍耗电优化的相关要点&#xff0c;让我们优化时有一个方向。 传感器 大多数Android设备都内置传感器&…

【停用词】NLP中的停用词怎么获取?我整理了6种方法

文章目录 一、停用词介绍二、停用词应用场景2.1 提取高频词2.2 词云图 三、停用词获取方法3.1 自定义停用词3.2 用wordcloud调取停用词3.3 用nltk调取停用词3.3.1 nltk中文停用词3.3.2 nltk英文停用词 3.4 用sklearn调取停用词3.5 用gensim调取停用词3.6 用spacy调取停用词 一、…

select语句与CSP模型~Go进阶

select语句 select 是 Go 中的一个控制结构。select 语句类似于 switch 语句&#xff0c;但是select会随机执行一个可运行的case。如果没有case可运行&#xff0c;它将阻塞&#xff0c;直到有case可运行。 语法结构 select语句的语法结构和switch语句很相似&#xff0c;也有…