用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本机依赖项。

用Spring Native将SpringBoot程序转换为GraalVM

一些依赖项,比如springdatajpa,需要额外的配置来支持GraalVM。Spring团队通过插件提供这些额外的配置。例如,在Intitializr中添加了Spring数据JPA依赖项之后,两个额外的Maven插件Spring aot Maven plugin和hibernate enhance Maven plugin(包括它们的配置)被添加到pom.xml文件。

此时并非所有依赖项都受Spring Native支持。如果initializer生成的Spring项目中包含不支持的依赖项,则HELP.md 文件将列出它。

用Spring Native将SpringBoot程序转换为GraalVM

与任何其他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

标签:Spring,Native,SpringBoot,GraalVM
0
投稿

猜你喜欢

  • 完全解析Android多线程中线程池ThreadPool的原理和使用

    2022-04-07 20:19:40
  • C语言内存操作函数详解

    2021-09-01 01:50:36
  • SpringBoot构建ORM框架的方法步骤

    2023-10-31 20:41:21
  • SparkSQL开窗函数分析使用示例

    2022-04-16 02:26:32
  • Flutter仿网易实现广告卡片3D翻转效果

    2021-07-23 22:38:05
  • java实战小技巧之字符串与容器互转详解

    2023-09-04 10:56:01
  • MyBatis基础支持DataSource实现源码解析

    2023-01-16 09:58:07
  • 一文带你掌握Spring Security框架的使用

    2021-12-02 09:41:00
  • Java源码解析HashMap的keySet()方法

    2023-11-11 06:33:05
  • Java实现五子棋AI算法

    2022-02-23 05:32:57
  • c#解析jobject的数据结构

    2023-09-28 00:25:33
  • flutter的导航和路由使用示例详解

    2023-11-21 07:06:34
  • C#中Equals和GetHashCode使用及区别

    2023-12-10 14:47:27
  • javaweb学习总结——使用JDBC处理MySQL大数据

    2022-10-19 22:45:32
  • Android实现手势滑动识别功能

    2022-06-23 00:16:59
  • Android SQLite基本用法详解

    2023-07-02 05:14:58
  • Android 文件存储与SharedPreferences存储方式详解用法

    2021-07-22 20:11:54
  • SpringBoot基于Actuator远程关闭服务

    2022-06-24 21:36:37
  • Android图片缓存之Bitmap详解(一)

    2021-10-24 15:45:08
  • DevExpress获取TreeList可视区域节点集合的实现方法

    2023-09-18 15:42:05
  • asp之家 软件编程 m.aspxhome.com