用Spring Native将SpringBoot程序转换为GraalVM

 更新时间:2021年04月27日 09:38:05   作者:老K的JAVA博客  
这篇文章主要介绍了用Spring Native将SpringBoot程序转换为GraalVM的方法,帮助大家更好的理解和学习使用SpringBoot,感兴趣的朋友可以了解下

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

以上就是用Spring Native将SpringBoot程序转换为GraalVM的详细内容,更多关于SpringBoot程序转换为GraalVM的资料请关注脚本之家其它相关文章!

相关文章

  • 使用maven shade插件解决项目版本冲突详解

    使用maven shade插件解决项目版本冲突详解

    这篇文章主要为大家介绍了使用maven shade插件解决项目版本冲突详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • spring boot 利用注解实现权限验证的实现代码

    spring boot 利用注解实现权限验证的实现代码

    这篇文章主要介绍了spring boot 利用注解实现权限验证的实现代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • idea2019导入maven项目中的某些问题及解决方法

    idea2019导入maven项目中的某些问题及解决方法

    这篇文章主要介绍了idea2019导入maven项目中的某些问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • Java关于jar包的知识详解

    Java关于jar包的知识详解

    这篇文章主要介绍了Java关于jar包的知识,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • Java项目打包发布到maven私仓常见的几种方式

    Java项目打包发布到maven私仓常见的几种方式

    这篇文章主要介绍了项目打包发布到maven私仓常见的几种方式,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-03-03
  • 解析Java中PriorityQueue优先级队列结构的源码及用法

    解析Java中PriorityQueue优先级队列结构的源码及用法

    优先级队列是一种队列结构,是0个或多个元素的集合,每个元素都有一个优先权,PriorityQueue被内置于JDK中,本文就来解析Java中PriorityQueue优先级队列结构的源码及用法.
    2016-05-05
  • SpringBoot中使用Servlet的两种方式小结

    SpringBoot中使用Servlet的两种方式小结

    这篇文章主要介绍了SpringBoot中使用Servlet的两种方式小结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • 快速理解Java垃圾回收和jvm中的stw

    快速理解Java垃圾回收和jvm中的stw

    这篇文章主要介绍了快速理解Java垃圾回收和jvm中的stw,涉及Java代码的停顿,jvm中的线程等相关内容,还是十分不错的,需要的朋友可以参考。
    2017-10-10
  • Java Lambda表达式与引用类浅析

    Java Lambda表达式与引用类浅析

    Lambda表达式是Java SE8中一个重要的新特性,允许通过表达式来代替功能接口。本文将通过一些简单的示例和大家讲讲Lamda表达式的使用,感兴趣的可以了解一下
    2023-01-01
  • Java8接口默认静态方法及重复注解原理解析

    Java8接口默认静态方法及重复注解原理解析

    这篇文章主要介绍了Java8接口默认静态方法及重复注解原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04

最新评论