使用GraalVM native-image 编译SpringBoot3全过程

这篇具有很好参考价值的文章主要介绍了使用GraalVM native-image 编译SpringBoot3全过程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文记录了使用native-image编译SpringBoot3.0.3的过程及遇到的问题。其中一些问题也是网上很多朋友遇到,我在实际操作的过程也遇到过同样的问题,在此做一记录。

目录

一、编译环境准备

1.1 安装GraalVM

1.2 安装native-image

1.3 IDE设置

1.4 Visual Studio 2022

1.5 pom.xml文件

二、使用native-image工具本地编译

三、AOT技术

3.1 AOT与JIT

3.2 缺点

3.3 JIT优点

3.4 JIT缺点

四、单元测试


一、编译环境准备

使用GraalVM native-image 编译SpringBoot3全过程,java,jvm,开发语言

1.1 安装GraalVM

它在java HotSpot JVM的基础上添加了JIT编译器和AOT来实现将应用编译成为本地可执行文件。除了java之外,GraalVM还支持JavaScript、Ruby、Python等多种编程语言。

GraalVM下载地址:https://www.oracle.com/downloads/graalvm-downloads.html。下载的时候选择对应的平台和版本。

GraalVM跟JDK一样也有两个版本,社区版和企业版本,大家可以根据需要自行选择。

如果下载的zip压缩文件,选择一个目录将它解压即可。

使用GraalVM native-image 编译SpringBoot3全过程,java,jvm,开发语言

1.2 安装native-image

  • 方法1 : 控制台输入命令 gu install native-image即可,下载速度贼慢
  • 方法2:在github上下载对应版本的native-image安装包进行本地安装

Release GraalVM Community Edition 22.3.0 · graalvm/graalvm-ce-builds (github.com)

使用GraalVM native-image 编译SpringBoot3全过程,java,jvm,开发语言

控制台输入命令 gu install -L 你的下载位置

安装成功,控制台输入gu list如图所示

使用GraalVM native-image 编译SpringBoot3全过程,java,jvm,开发语言

环境变量配置:

JAVA_HOME = GraalVM的的根目录

PATH = %JAVA_HOME%\bin

1.3 IDE设置

打开项目的Project Settings,SDK--->Edit---->Add SDK 选择GraalVM。

使用GraalVM native-image 编译SpringBoot3全过程,java,jvm,开发语言

Edit Configurations

使用GraalVM native-image 编译SpringBoot3全过程,java,jvm,开发语言

设置Build and run 的JRE为GraalVM-17

使用GraalVM native-image 编译SpringBoot3全过程,java,jvm,开发语言

1.4 Visual Studio 2022

由于Windows相关的命令行最大长度限制,所以需要使用x64 Native Tools Command Prompt而不是常规的Windows命令来运行maven或者Gradle插件。

安装好后需要配置Visual Studio的环境变量。

使用GraalVM native-image 编译SpringBoot3全过程,java,jvm,开发语言

使用GraalVM native-image 编译SpringBoot3全过程,java,jvm,开发语言

mvn -Pnative native:compile

1.5 pom.xml文件

<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

native-maven-plugin 默认为最新版本:0.9.20

二、使用native-image工具本地编译

1、打开X64 Native Tools Command Propmt窗口执行:

mvn -Pnative native:compile

执行过程中出现下面错误信息:

Execution of E:\tools\graalvm-ce-java17-22.3.1\bin\native-image.cmd @target\tmp\native-image-2154084464642699530.args returned non-zero result

如下图:

使用GraalVM native-image 编译SpringBoot3全过程,java,jvm,开发语言

根据错误提示我们查看并修改

F:\myworkspace\demo-test\demo\target\native-image-2154084464642699530.args

文件将里面的所有\\路径全局替换为/路径符号。

替换前:

使用GraalVM native-image 编译SpringBoot3全过程,java,jvm,开发语言

替换后:

使用GraalVM native-image 编译SpringBoot3全过程,java,jvm,开发语言

为什么将“\\”替换为“/”就可以成功执行,此处应该是 native-maven-plugin(0.9.20) 版本导致的,0.9.19版本也有同样的问题,在linux下应该没有此问题。

 然后我们手动执行刚才报错的命令 (重要,也就是原来一步完成的任务,现在需要两步完成)

native-image @target\tmp\native-image-2154084464642699530.args

此处我们也可以将args文件中的参数粘贴出来作为native-image 后面的参数,不需要替换路径,只需要将相关参数合并成单行命令执行也能成功,说明native-image通过vcvars64.bat脚本执行后是支持window的路径\\格式的)

使用GraalVM native-image 编译SpringBoot3全过程,java,jvm,开发语言

等价于

使用GraalVM native-image 编译SpringBoot3全过程,java,jvm,开发语言

执行完毕结果

使用GraalVM native-image 编译SpringBoot3全过程,java,jvm,开发语言

本文参考:

SpringBoot3 Graalvm Native-Image尝鲜_Zyp168168的博客-CSDN博客

三、AOT技术

GraalVM Native Images是一个利用AOT(Ahead-of-Time)技术把java程序直接编译成可执行程序的编译工具,编译出来的程序在运行时不再依赖JRE,同时启动速度快,资源消耗低,这对传统java程序来说都是极大的优势。

同时云原生应用来说,GraalVM Native Images编译生成的程序体积很小,非常适合云原生环境,目前由于传统java程序生成的镜像中需要包含一个体积很大的JRE或JDK而经常被人诟病。Spring Boot从3.0版本开始支持AOT技术。

3.1 AOT与JIT

  • 在程序运行前编译,可以避免在运行时的编译性能消耗和内存消耗
  • 可以在程序运行初期就达到最高性能
  • 可以显著的加快程序的启动

3.2 缺点

  1. 程序运行时动态调整的资源无法直接使用,例如反射、动态代理等,需要在代码中通过Hint为编译器指定
  2. 应用的classpath在编译后就固定了,不能动态调整
  3. 类不会延迟加载(lazy loading),应用启动时一次性加载完成
  4. 部分java切面(AOP)技术不支持
  5. 编译时间长
  6. 牺牲了跨平台的的优势
  7. 将提前编译的内容保存会占用更多的外存

3.3 JIT优点

    顺便说一下JIT

  • 可以根据当前硬件情况实时编译生成最优机器指令(ps. AOT也可以做到,在用户使用是使用字节码根据机器情况在做一次编译)
  • 可以根据当前程序的运行情况生成最优的机器指令序列
  • 当程序需要支持动态链接时,只能使用JIT
  • 可以根据进程中内存的实际情况调整代码,使内存能够更充分的利用

3.4 JIT缺点

  • 编译需要占用运行时资源,会导致进程卡顿
  • 由于编译时间需要占用运行时间,对于某些代码的编译优化不能完全支持,需要在程序流畅和编译时间之间做权衡
  • 在编译准备和识别频繁使用的方法需要占用时间,使得初始编译不能达到最高性能

四、单元测试

传统的Spring Boot3单元测试技术仍然可以使用。需要注意的是 Spring Native不支持JUnit4,需要使用JUnit5。文章来源地址https://www.toymoban.com/news/detail-676666.html

到了这里,关于使用GraalVM native-image 编译SpringBoot3全过程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot3之GraalVM之Windows详细安装及使用教程

    我直接使用的是IDEA plugins文件夹下的maven 新建MAVEN_HOME环境变量 Path环境变量追加 因为GraalVM需要调用操作系统的底层工具,而Windows底层工具是VisualStudio,所以我们要先下载安装好VisualStudio。 下载Visual Studio Community 《Visual Studio Community官网下载》 下载完以后直接安装即可 选择

    2024年02月14日
    浏览(38)
  • Spring Boot 3.0 GA来啦,GraalVM Native Image Support初体验

    2022-11-25, SpringBoot 3.0.0 GA 版本发布,带了Web Javaer万众期待的 Cloud Native 特性,这也意味着占据Java Web圈半壁江山的Spring框架正式进入真正的云原生时代。笔者作为一名多年的Java Web开发者,异常激动和兴奋,因为尽管java生态圈在全球开发领域占据非常大的份额,国内各类IT企

    2023年04月09日
    浏览(40)
  • SpringBoot3 GraalVM 原生镜像打包 搭建云原生环境

    java发布到如今,已经过去几十年,如今微服务、云原生逐渐成为了主流,java原本的很多优势不再重要,而启动慢,耗内存等的缺点也越来越被放大. java在新发布的很多相关技术中也做出了很多改变 其中SpringBoot3结合GraalVM,可以直接将java项目打包成原生可执行文件,提升运行速度并大

    2024年02月06日
    浏览(50)
  • SpringBoot3.0新特性:1、spring.factories文件废弃,自动配置包位置变化 2、Spring Native 快速体验 3、jakata api迁移 3、三方库的支持

    有自己写过starter包的友友们一定知道,一定用/META-INF/spring.factories文件定义发现自动配置,但是在springboot 2.7,这个文件就被弃用了,在springboot 3.0 就被彻底移除了。 比如之前定义的/META-INF/spring.factories文件: 而现在 这个/META-INF/spring.factories并不是不存在了,只是在3.0之后 外

    2024年02月10日
    浏览(46)
  • GraalVM详细安装及打包springboot、java、javafx使用教程(环境安装篇)

    下一篇:GraalVM详细安装及打包springboot、java、javafx使用教程(打包普通JAVA项目篇) GraalVM是一款由Oracle公司开发的一款具有高效性能、降低基础设施成本、支持Java发展、与其他编程语言无缝集成、创建本机镜像等优点的跨平台虚拟机。它支持多种编程语言,如Java、JavaScript、Rub

    2024年04月26日
    浏览(38)
  • React Native expo项目使用expo-image-picker上传图片

     app.json: https://docs.expo.dev/versions/latest/sdk/imagepicker/      expo-image-picker 图片上传 要使用Expo的ImagePicker库进行图片上传,您可以按照以下步骤操作。 首先,确保您已在项目中安装了Expo的ImagePicker库。 然后,您可以使用以下代码来选择图片并上传: 此示例使用Button和Image组件创

    2024年02月15日
    浏览(38)
  • 解析用GraalVm编译的class文件

    如果只是单纯的用javap +class文件名的话,那只是单纯的反编译class文件而已。 我们都知道class文件的字节码文件,是难以理解的。 很好理解。这里保存了最新更改时间和文件大小为414字节。 类声明: 版本信息: 这表示 Java 编译器的次要版本为 0,主要版本为 61。Java 版本号

    2024年01月18日
    浏览(44)
  • springboot3使用swagger文档

    在pom.xml里面引入如下俩个依赖 然后启动项目,打开浏览器访问 http://localhost:8080/swagger-ui.html 就可以看到生成的文档了  最后附上swagger2到open api的注解变化    

    2024年02月13日
    浏览(50)
  • Spring3新特性:Graalvm打包Springboot+Mybatis;Graalvm打包成Docker

    项目源代码 https://github.com/cmdch2017/SpringNative_Graalvm_Mybatis 安装graalvm与配置环境 首先安装步骤参考这篇博客 https://blog.csdn.net/weixin_38943666/article/details/129505945 其次如何处理反射 https://blog.csdn.net/qq_32740973/article/details/131799510 第一步,直接拷贝我项目中的config文件夹到你的项目 第

    2024年01月19日
    浏览(58)
  • 【SpringBoot3】使用 devtools 实现代码热部署

    Spring Boot DevTools是一组用于提高开发人员生产力,并加速Spring Boot应用程序开发的工具。它提供了一些功能,可以帮助开发人员更快速地构建应用程序,并减少常见的开发问题。 Spring Boot DevTools的主要作用包括: 自动重新加载 :当应用程序中的代码发生变化时,DevTools会自动

    2024年01月16日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包