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

编译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.hqwc.cn/news/17560.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL数据库(三)

前言 聚合查询、分组查询、联合查询是数据库知识中最重要的一部分&#xff0c;是将表的行与行之间进行运算。 目录 前言 一、聚合查询 &#xff08;一&#xff09;聚合函数 1、count 2、sum 3、avg 4、max 5、min 二、分组查询 &#xff08;一&#xff09;group by …

【python手写算法】利用梯度下降实现线性拟合

利用梯度下降实现线性拟合&#xff0c;效果和sklearn LinearRegression()差不多。 学习率初始设置为0.1结果算高的&#xff0c;直接让我的参数变成了nan。&#xff08;体会到了飞出去的感觉&#xff09; 把学习率调小了之后就正常了 # codingutf-8 import matplotlib.pyplot a…

<数据结构>NO9.选择类排序|直接选择排序|堆排序

文章目录 选择排序1.直接选择排序优化直接选择排序 2. 堆排序 选择排序 基本思想 选组排序是从待排序数据中选出最大/最小的元素放入到序列的起始位置&#xff0c;直到待排序数据全部有序。 直接选择排序和堆排序的基本思想均符合选择排序。 1.直接选择排序 假设数据按升序…

时间序列预测 | Matlab基于粒子群算法(PSO)优化径向基神经网络(PSO-RBF)的时间序列预测

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 时间序列预测| Matlab基于粒子群算法(PSO)优化径向基神经网络(PSO-RBF)的时间序列预测 评价指标包括:MAE、MBE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分源码 %% 清空环境变量 warni…

改进二进制粒子群算法在配电网重构中的应用(Matlab实现)【论文复现】

目录 0 概述 1 配电网重构的目标函数 2 算例 3 matlab代码实现 0 概述 配电系统中存在大量的分段开关和联络开关&#xff0c;配电网重构正是通过调整分段开关和联络升大的组合状态来变换网络结构,用于优化配电网某些指标&#xff0c;使其达到最优状态。正常运行时,则通过两…

高效工作:ADManager Plus的利器

在当今快节奏的商业环境中&#xff0c;高效的工作是成功的关键。对于IT管理员来说&#xff0c;管理和维护Active Directory&#xff08;AD&#xff09;环境是一项重要的任务。然而&#xff0c;手动处理繁琐的AD管理任务可能会占用大量的时间和精力&#xff0c;影响工作效率。为…

RLHF-基于人类反馈的强化学习

RLHF 文章目录 RLHF强化学习基础回顾为什么要使用基于人类反馈的强化学习大纲RLHF的起源大预言模型中的RLHF案例 ChatGPT RLHF中的技术细节预训练语言模型训练奖励模型基于RL进行微调 RLHF 的未来 强化学习基础回顾 智能体通过采取行动与环境进行交互&#xff0c;并返回状态和奖…

SpringCloud微服务(三)RabbitMQ、SpringAMQP、elasticsearch、DSL、MQ、ES详细介绍

目录 一、初始MQ 同步调用 异步调用 什么是MQ 执行下面的命令来运行MQ容器&#xff1a; 如果冲突了&#xff0c;可以先查询 RabbitMQ概述 常见消息模型 HelloWorld案例 二、SpringAMQP 引入依赖 Work Queue 消费预取限制 ​编辑 发布、订阅 发布订阅Fanout Ex…

能不能推荐个 vue 后台管理系统模板?

前言 下面是我整理的vue2和vue3的一些后台管理系统模板&#xff0c;希望对你有帮助~ Vue2 1、iview-admin Star: 16.4k 基于 iview组件库开发的一款后台管理系统框架&#xff0c;提供了一系列的强大组件和基础模板&#xff0c;方便开发人员快速搭建一套功能丰富、界面美观、…

红帽回应对开源的承诺

导读红帽上周宣布了限制源代码访问性的政策&#xff0c;称其企业发行版 RHEL (Red Hat Enterprise Linux) 相关源码仅通过 CentOS Stream 公开&#xff0c;付费客户和合作伙伴可通过 Red Hat Customer Portal 访问到源代码。 红帽上周宣布了限制源代码访问性的政策&#xff0c…

在Microsoft Excel中带单位的数字如何求和

使用 Excel 中的 SUM 函数对一系列单元格、整列或非连续单元格求和。要创建出色的 SUM 公式&#xff0c;请将 SUM 函数与其他 Excel 函数结合使用&#xff0c;然而 SUM 函数不能直接对带单位的数字进行求和。 当直接相加带单位的几个数字会出现如下错误&#xff1a; 错误的原因…

Keepalived 安装与配置

安装 Keepalived apt -y install keepalived 里边有一个杠y&#xff0c;就是我安装的时候里面有yes&#xff0c;就直接是yes 添加 Keepalived 配置 安装好之后, 下一步就开始去来写这个配置文件了&#xff0c;就在这里面去建一个 etc 当中&#xff0c;就是在这个 etc 当中建一个…