springboot学习(八十六) springboot使用graalvm编译native程序

一、windows环境下

1.下载graalvm的jdk

https://injdk.cn/
下载windows版本

配置java环境变量,配置过程略

2.下载visual Studio Build Tools

下载地址:https://aka.ms/vs/17/release/vs_BuildTools.exe

安装后选择组件:
在这里插入图片描述
其中windows SDK根据实际情况选择

3.编写springboot代码

3.1 maven代码

pox.xml

<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.2.3</version>
<relativePath/>
<!--  lookup parent from repository  -->
</parent>
<groupId>org.example</groupId>
<artifactId>native-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>native-demo</name>
<description>native-demo</description>
<properties>
<java.version>21</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>
<repositories><repository>
<id>aliyun</id>
<name>aliyun Repository</name>
<url>https://maven.aliyun.com/repository/public/</url>
</repository>
<repository>
<id>central-repos</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2/</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>aliyun</id>
<name>aliyun Repository</name>
<url>https://maven.aliyun.com/repository/public/</url>
</pluginRepository>
<pluginRepository>
<id>central-repos</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2/</url>
</pluginRepository>
</pluginRepositories>
<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>

启动类:

package org.example.nativedemo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@SpringBootApplication
@RestController
public class NativeDemoApplication {@GetMappingpublic String test() {return "success";}public static void main(String[] args) {SpringApplication.run(NativeDemoApplication.class, args);}}

3.2 gradle代码

gradle.build:

plugins {id 'java'id 'org.springframework.boot' version '3.2.3'id 'io.spring.dependency-management' version '1.1.4'id 'org.graalvm.buildtools.native' version '0.9.28'
}group = 'org.example'
version = '0.0.1-SNAPSHOT'java {sourceCompatibility = '21'
}repositories {mavenCentral()
}dependencies {implementation 'org.springframework.boot:spring-boot-starter-web'testImplementation 'org.springframework.boot:spring-boot-starter-test'
}tasks.named('test') {useJUnitPlatform()
}

启动类

package org.example.demonativegradle;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@SpringBootApplication
@RestController
public class DemoNativeGradleApplication {@GetMappingpublic String test() {return "success";}public static void main(String[] args) {SpringApplication.run(DemoNativeGradleApplication.class, args);}}

4.打包

4.1 maven打包

配置maven环境变量(略)

打包:
使用x64 native tools打开命令行
在这里插入图片描述

进入项目目录在,执行命令

mvn -Pnative native:compile

打包的二进制包在target下

4.2 gradle打包

使用x64 native tools打开命令行
在这里插入图片描述

进入项目目录在,执行命令

gradle nativeCompile

打包的二进制包在build/native/nativeComplie下

二、linux环境下

1.下载graalvm的jdk

https://injdk.cn/
下载linux以及对应架构的版本

配置java环境变量,配置过程略

2.安装依赖库

yum install -y gcc glibc-devel zlib-devel

3.编写springboot代码

与windows下的测试代码一致

4.打包

4.1 maven打包

配置maven环境变量

进入项目目录在,执行命令

mvn -Pnative native:compile

打包的二进制包在target下

4.2 gradle打包

进入项目目录在,执行命令

gradle nativeCompile

打包的二进制包在build/native/nativeComplie下

三、反射、序列化等问题处理

工程中如果有反射、序列化等,打的二进制包运行时会出问题,需要进行处理。

首先将springboot项目打jar包(gradle中bootJar,maven中repackage或install等其他方式)

配置graalvm 的jdk环境变量运行jar包

java -Dspring.aot.enabled=true -agentlib:native-image-agent=config-output-dir=./config -jar target/<jar包名>

jar包启动后,尽量在页面或其他测试手段测试所有可能得功能,control+c停止执行后会在jar包同级目录的config重生成一些配置文件,将这些配置文件拷贝到项目的resource/META-INF/native-image下

再执行native打包即可

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

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

相关文章

实现Docker容器时间与宿主机时间同步

确保Docker容器的时间与宿主机系统时间同步&#xff0c;可以采用以下几种方法&#xff1a; 挂载宿主机的/etc/localtime文件&#xff1a; 当创建Docker容器时&#xff0c;可以通过 -v 参数来挂载宿主机的系统时间和时区配置到容器内&#xff1a; docker run -d --name containe…

探索 Spring 框架:企业级应用开发的强大工具

CSDN-个人主页&#xff1a;17_Kevin-CSDN博客 收录专栏&#xff1a;《Java》 目录 一、引言 二、Spring 框架的历史 三、Spring 框架的核心模块 四、Spring 框架的优势 五、Spring 框架的应用场景 六、结论 一、引言 在当今数字化时代&#xff0c;企业级应用开发的需求日…

Spring Boot 中@Scheduled是单线程还是多线程?

在开发Spring Boot应用程序时&#xff0c;定时任务是一项常见的需求。Spring Boot提供了Scheduled注解&#xff0c;可用于将方法标记为定时任务&#xff0c;并在预定的时间间隔内执行。那么Scheduled注解的执行方式是单线程执行&#xff0c;还是多线程执行&#xff1f;Schedule…

谷歌通用AI智能体发布,3D游戏玩法要变天了

谷歌DeepMind号称打造出了首个能在广泛3D虚拟环境和视频游戏中遵循自然语言指令的通用AI智能体。 名为SIMA&#xff0c;不是NPC&#xff0c;是可以成为玩家拍档&#xff0c;帮忙干活打杂的那种。 比如&#xff0c;在《模拟山羊3》&#xff08;Goat Simulator 3&#xff09;中当…

Unload-labs

function checkFile() {var file document.getElementsByName(upload_file)[0].value;if (file null || file "") {alert("请选择要上传的文件!");return false;}//定义允许上传的文件类型var allow_ext ".jpg|.png|.gif";//提取上传文件的类…

C#,数值计算,数据测试用的对称正定矩阵(Symmetric Positive Definite Matrix)的随机生成算法与源代码

C.Hermite 1、对称矩阵 对称矩阵(Symmetric Matrices)是指以主对角线为对称轴,各元素对应相等的矩阵。在线性代数中,对称矩阵是一个方形矩阵,其转置矩阵和自身相等。1855年,埃米特(C.Hermite,1822-1901年)证明了别的数学家发现的一些矩阵类的特征根的特殊性质,如称为埃…

Elastic Agent 的安装及使用

概述 Elastic Agent是Elastic Stack中的一个全新组件&#xff0c;旨在简化和统一监控和集成管理流程。它是一个轻量级的代理&#xff0c;可以部署到各种不同类型的主机和容器中&#xff0c;用于收集系统指标、日志和事件数据&#xff0c;并将其发送到Elasticsearch进行存储和分…

知识蒸馏Matching logits与RocketQAv2

知识蒸馏Matching logits 公式推导 刚开始的怎么来&#xff0c;可以转看下面证明梯度等于输出值-标签y C是一个交叉熵&#xff0c;我们要求解的是这个交叉熵对的这个梯度。就是你可以理解成第个类别的得分。就是student model&#xff0c;被蒸馏的模型&#xff0c;它所输出的…

vue iview 级联选择器遇到的坑

我们PC项目用到的前端技术栈是vue+iview,最近有个需求,要做个级联选择器,并且是懒加载动态加载后端返回的数据。效果如下: 如下图所示,在我们封装的公共组件form-box.vue里有我们级联选择器: 代码如下: <!--级联选择器--><template v-else-if="item.type…

蓝桥杯 EDA 组 2021-2022 省赛真题+模拟题原理图解析

本文解析了标题内的原理图蓝桥杯EDA组真题&#xff0c;为方便阅读2023年真题/模拟和国赛部分放到其他章节解析。下文中重复或者是简单的电路节约篇幅不在赘述。 其中需要补充和计算原理图的题目解析都放在最下面 一、2021第十二届真题第一场 1.1 AMS1117 线性稳压器 最常见的1…

PyTorch搭建AlexNet训练集

本次项目是使用AlexNet实现5种花类的识别。 训练集搭建与LeNet大致代码差不多&#xff0c;但是也有许多新的内容和知识点。 1.导包&#xff0c;不必多说。 import torch import torch.nn as nn from torchvision import transforms, datasets, utils import matplotlib.pypl…

【STM32学习】基本定时器,输出比较模式,基本参数

1、概述 此项功能是用来控制一个输出波形&#xff0c;或者指示一段给定的的时间已经到时。 如输出PWM信号时&#xff0c;可用这个模式。 2、输出比较初始化函数&#xff0c;基本参数 以上函数是用来配置输出比较模块的&#xff0c;每个函数对应一个定时器的通道&#xff0c;配…