用Spring Native将SpringBoot程序转换为GraalVM
作者:老K的JAVA博客 发布时间:2023-09-17 16:23:00
Spring发布了一个新工具Spring Native Beta,用于将现有的Spring Boot应用程序(用Java或Kotlin编写)转换为GraalVM本机映像。目标是在springnative上支持Spring Boot应用程序。GraalVM本机映像很小,经过优化,启动速度很快。然而,与JVM相比,折衷的办法是构建时间更长,运行时优化更少。
Spring Native与GraalVM团队合作,充当桥梁,确保GraalVM理解传统的SpringBoot代码。Oracle实验室的高级研究经理Vojin Jovanovic在谈到他们与Spring的合作时说:
与Spring团队合作构建本机JVM生态系统是一件非常愉快的事情:他们深厚的技术知识和对社区敏感的触觉总能带来最好的解决方案。最新的Spring本机版本及其在JVM生态系统中的大量使用为本机编译的广泛采用铺平了道路。
在后台,Maven和Gradle提供的提前(AOT)插件用于将Spring引导应用程序转换为本机代码。这些插件为GraalVM不支持的所有Spring元素(如反射和代理)生成GraalVM本机配置。生成的配置存储在reflect-config.json 文件。例如,用@Service注释的每个类都在JSON文件中配置。
假设Spring本机配置文件位于META-INF/Native-image文件夹中,则可以发现它们。本机提示可用于配置SpringNative尚不支持的元素,例如MySQL驱动程序配置。
创建新项目时,Spring Initializer中提供了Spring本机依赖项。
一些依赖项,比如springdatajpa,需要额外的配置来支持GraalVM。Spring团队通过插件提供这些额外的配置。例如,在Intitializr中添加了Spring数据JPA依赖项之后,两个额外的Maven插件Spring aot Maven plugin和hibernate enhance Maven plugin(包括它们的配置)被添加到pom.xml文件。
此时并非所有依赖项都受Spring Native支持。如果initializer生成的Spring项目中包含不支持的依赖项,则HELP.md 文件将列出它。
与任何其他Spring Boot应用程序一样,Initializer会自动创建适当的入口点类来运行应用程序:
@SpringBootApplication
public class NativeApplication {
public static void main(String[] args) {
SpringApplication.run(NativeApplication.class, args);
}
}
接下来,提供一个REST controller来测试应用程序:
@Controller
public class NativeEndpoint {
@GetMapping("/native")
public String nativeCall() {
return "Native";
}
}
除了标准的SpringBoot依赖项之外,Initializer还为SpringNative支持添加了一个新的依赖项:
<dependency>
<groupId>org.springframework.experimental</groupId>
<artifactId>spring-native</artifactId>
<version>${spring-native.version}</version>
</dependency>
spring boot maven插件接收了一些额外的配置来生成本机映像:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<image>
<builder>paketobuildpacks/builder:tiny</builder>
<env>
<BP_NATIVE_IMAGE>true</BP_NATIVE_IMAGE>
</env>
</image>
</configuration>
</plugin>
Maven可用于通过提前编译生成本机映像。生成的可执行文件包括所有必要的类和来自JDK的静态链接本机代码。底层VM被用作运行时系统,而不是普通的javavm。
$ ./mvnw spring-boot:build-image
在编译和优化代码时,构建映像需要一些时间。此步骤在Docker映像中执行,需要相当多的内存。如果发生以下错误,应增加Docker的内存设置:
Exception in thread "native-image pid watcher" java.lang.OutOfMemoryError:
GC overhead limit exceeded
执行上述Maven命令的输出显示了结果Docker映像,其中包含GraalVM本机映像:
Successfully built image 'docker.io/library/native:0.0.1-SNAPSHOT'
生成的映像约为82 MB,包含运行应用程序的所有内容:
$ docker images
native 0.0.1-SNAPSHOT ... 81.9MB
Docker容器在端口8080上启动:
$ docker run -p 8080:8080 native:0.0.1-SNAPSHOT
启动容器后,应用程序几乎可以立即进行测试:
$ curl localhost:8080/native --silent
Native
来源:https://javakk.com/1859.html


猜你喜欢
- 首先分析一下问题:其实这个红框不是android的bug,把编译模式从eng改成user就可以了,红框只是eng模式debug的时候提示你系
- 不多说废话,直接进入主菜!!步骤:1.搭建SpringBoot的开发环境,略(有不会的可以私信我)。2.编写一个自定义异常,自定义异常需要继
- 前言在一个 Web 请求中,参数我们无非就是放在地址栏或者请求体中,个别请求可能放在请求头中。放在地址栏中,我们可以通过如下方式获取参数:S
- 上篇文章我们介绍了API网关的基本构建方式以及请求过滤,小伙伴们对Zuul的作用应该已经有了一个基本的认识,但是对于路由的配置我们只是做了一
- 整理文档,搜刮出一个Java实现身份证号码验证源码示例代码,稍微整理精简一下做下分享。package xxx;/** * Created b
- 前言:Guarded Suspension意为保护暂停,其核心思想是仅当服务进程准备好时,才提供服务。设想一种场景,服务器可能会在很短时间内
- 首先,定义TabHost的布局文件:<?xml version="1.0" encoding="utf-
- Spring中有个RestTemplate类用来发送HTTP请求很方便,本文分享一个SpringBoot发送POST请求并接收返回数据的例子
- 对于Android View的测量,我们一句话总结为:
- WPF前台代码展示<Window.Resources> <local:Source x:Key=
- public partial class MonthCalendarForm : Form{ public MonthCalen
- 引言二分查找底层依赖的是数组随机访问的特性,所以只能用数组来实现。如果数据存储在链表中,就真的没法用二分查找算法了吗?实际上,只需要对链表稍
- 简介Android Studio升级到3.0后,有不少的改动和新特性,先贴出官方的迁移说明。本文会持续收集与总结本人在使用Android S
- Java中,将字节数组转成图片的有很多种方式,今天在这里记录其中一种,方便以后查询,也可以提供给没有接触的童鞋做一个参考。首先是将图片转成字
- 实现多表联合查询还是在david.mybatis.model包下面新建一个Website类,用来持久化数据之用,重写下相应toString(
- 本文实例分析了C#双缓冲技术。分享给大家供大家参考,具体如下:双缓冲解决闪烁问题。整理:GDI+的双缓冲问题一直以来的误区:.net1.1
- 首先要解析string类型的xml必须先要将其转化成dom格式,然后再进行解析取值,如下是解析代码示例:package com.compan
- 一、使用注解实现自定义映射关系当POJO属性名与数据库列名不一致时,需要自定义实体类和结果集的映射关系,在MyBatis注解开发中,使用 @
- 引言CardView是Android 5.0系统之后引入的众多控件之一,实现之后的效果也是比较酷的,它经常被用在RecyclerView和L
- 本文实现了C#隐式运行CMD命令的功能。下图是实例程序的主画面。在命令文本框输入DOS命令,点击“Run”按钮,在下面的文本框中输出运行结果