简介

GraalVM是高性能的JDK,支持Java/Python/JavaScript等语言。它可以让Java变成二进制文件来执行,让程序在任何地方运行更快。这或许是Java与Go的一场战争?

下载安装GraalVM

安装GraalVM

首先到官网下载,我是直接到GitHub Release Page下载的,请下载对应的系统包,我下载如下:

graalvm-ce-java11-darwin-amd64-22.3.0.tar.gz

下载后解压到某个目录,我的如下:

/Users/larry/Software/graalvm-ce-java11-22.3.0

接着测试对应的程序是否可以正常执行,如java --version。在Mac上会报错如下:

is damaged and can’t be opened.

所以需要执行下面语句:

  1. $ sudo xattr -r -d com.apple.quarantine /Users/larry/Software/graalvm-ce-java11-22.3.0

注意修改对应的目录。

然后就可以执行了:

  1. $ ./java --version
  2. openjdk 11.0.17 2022-10-18
  3. OpenJDK Runtime Environment GraalVM CE 22.3.0 (build 11.0.17+8-jvmci-22.3-b08)
  4. OpenJDK 64-Bit Server VM GraalVM CE 22.3.0 (build 11.0.17+8-jvmci-22.3-b08, mixed mode, sharing)

安装native-image

这个工具用来把Java程序转化为本地二进制包,安装如下:

  1. $ ./gu install native-image
  2. Downloading: Component catalog from www.graalvm.org
  3. Processing Component: Native Image
  4. Downloading: Component native-image: Native Image from github.com
  5. Installing new component: Native Image (org.graalvm.native-image, version 22.3.0)

配置环境

配置环境变量

因为这个GraalVM还不够成熟,我不想一直使用,就通过一个命令来切换,配置如下:

  1. export GraalVM_HOME=/Users/larry/Software/graalvm-ce-java11-22.3.0/Contents/Home
  2. alias switchOnGraalVM='export PATH=$GraalVM_HOME:$PATH'
  3. alias switchOnGraalVMJavaHome='export JAVA_HOME=/Users/larry/Software/graalvm-ce-java11-22.3.0/Contents/Home'
  4. alias switchOffGraalVM='export PATH=`echo $PATH | tr ":" "\n" | grep -v "graalvm" | tr "\n" ":"`'
  5. alias switchOffGraalVMJavaHome='export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_212.jdk/Contents/Home'

配置IDEA

可以在IDEA上配置对应的JDK,这样开发的时候可以使用:

整合Spring Native与Spring Boot

普通Spring Boot程序

新来创建一个普通的Spring Boot Web程序,主要Java代码如下:

  1. @SpringBootApplication
  2. @RestController
  3. @RequestMapping("/")
  4. public class SpringbootNativeGraalVMMain {
  5. public static void main(String[] args) {
  6. SpringApplication.run(SpringbootNativeGraalVMMain.class, args);
  7. }
  8. @GetMapping("/hi-graalvm")
  9. public String hi() {
  10. return "This message is from Spring Boot built/run by GraalVM/Spring Native";
  11. }
  12. }

启动时长为1.193秒,还不错。我电脑还不错。

整合Spring Native

添加依赖:

  1. <dependency>
  2. <groupId>org.springframework.experimental</groupId>
  3. <artifactId>spring-native</artifactId>
  4. <version>${spring-native.version}</version>
  5. </dependency>

添加插件,这个插件非常重要,不然会有各种错误:

  1. <build>
  2. <plugins>
  3. <plugin>
  4. <groupId>org.springframework.experimental</groupId>
  5. <artifactId>spring-aot-maven-plugin</artifactId>
  6. <version>0.11.5</version>
  7. <executions>
  8. <execution>
  9. <id>test-generate</id>
  10. <goals>
  11. <goal>test-generate</goal>
  12. </goals>
  13. </execution>
  14. <execution>
  15. <id>generate</id>
  16. <goals>
  17. <goal>generate</goal>
  18. </goals>
  19. </execution>
  20. </executions>
  21. </plugin>
  22. </plugins>
  23. </build>

添加以下插件来打包生成可执行程序:

  1. <profiles>
  2. <profile>
  3. <id>native</id>
  4. <properties>
  5. <repackage.classifier>exec</repackage.classifier>
  6. <native-buildtools.version>0.9.11</native-buildtools.version>
  7. </properties>
  8. <dependencies>
  9. <dependency>
  10. <groupId>org.junit.platform</groupId>
  11. <artifactId>junit-platform-launcher</artifactId>
  12. <scope>test</scope>
  13. </dependency>
  14. </dependencies>
  15. <build>
  16. <plugins>
  17. <plugin>
  18. <groupId>org.graalvm.buildtools</groupId>
  19. <artifactId>native-maven-plugin</artifactId>
  20. <version>${native-buildtools.version}</version>
  21. <extensions>true</extensions>
  22. <executions>
  23. <execution>
  24. <id>test-native</id>
  25. <phase>test</phase>
  26. <goals>
  27. <goal>test</goal>
  28. </goals>
  29. </execution>
  30. <execution>
  31. <id>build-native</id>
  32. <phase>package</phase>
  33. <goals>
  34. <goal>build</goal>
  35. </goals>
  36. </execution>
  37. </executions>
  38. </plugin>
  39. </plugins>
  40. </build>
  41. </profile>
  42. </profiles>

然后通过以下命令来build包,时间会长很多,因为要转化为二进制可执行文件:

  1. $ mvn clean package -Pnative

两分多钟后完成,生成了一个可执行文件,执行如下:

  1. $ target/spring-boot-native-graalvm

结果只花了0.066秒,即66毫秒就可以了,这也太快了吧。

访问接口也是正常的:

用Docker启动

先启动本地的Docker,然后添加依赖如下:

  1. <plugin>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-maven-plugin</artifactId>
  4. <configuration>
  5. <classifier>${repackage.classifier}</classifier>
  6. <image>
  7. <builder>paketobuildpacks/builder:tiny</builder>
  8. <env>
  9. <BP_NATIVE_IMAGE>true</BP_NATIVE_IMAGE>
  10. </env>
  11. </image>
  12. </configuration>
  13. </plugin>

通过以下命令打出Docker镜像:

  1. mvn spring-boot:build-image

可能会花费很长时间,需要下载一些工具与镜像。

打包成功后,多了镜像:

  1. $ docker images | grep graalvm
  2. spring-boot-native-graalvm 1.0-SNAPSHOT d2c8d5c52a3c 42 years ago 85.8MB

启动如下:

  1. $ docker run --rm spring-boot-native-graalvm:1.0-SNAPSHOT -p 8080:8080

启动时间为59ms,更短了。

注意

  • 直接通过native-image命令来将jar包转化为可执行文件,如遇到各种问题,劝大家放弃尝试,这也是Spring Native存在的价值。别问我为什么知道,哈哈~~
  • 要注意切换对应的Java程序和Java Home,不然build包会报错。
  • 看Spring Native的包名是experimental的,离生产应该还有距离,不要轻易在生产上用。

代码

代码请看GitHub: https://github.com/LarryDpk/pkslow-samples


References:

Quick Start Guide

GraalVM Quick Reference

GraalVM Native Image Quick Reference v1

向云原生靠近 | 体验 GraalVM 静态编译字节码,尝试 “超声波 Java” - Quarkus

GraalVM和Spring Native尝鲜,一步步让Springboot启动飞起来,66ms完成启动的更多相关文章

  1. SpringBoot3.x原生镜像-Native Image尝鲜

    前提 Spring团队致力于为Spring应用程序提供原生映像支持已经有一段时间了.在SpringBoo2.x的Spring Native实验项目中酝酿了3年多之后,随着Spring Framewor ...

  2. 【翻译】五步快速使用LINQPad尝鲜StreamInsight

    StreamInsight  学习地址:http://www.cnblogs.com/StreamInsight/archive/2011/10/26/StreamInsight-Query-Seri ...

  3. Spring-Data-JPA尝鲜:快速搭建CRUD+分页后台实例

    前言:由于之前没有接触过Hibernate框架,但是最近看一些博客深深被它的"效率"所吸引,所以这就来跟大家一起就着一个简单的例子来尝尝Spring全家桶里自带的JPA的鲜 Spr ...

  4. 前端每周清单第 49 期:Webpack 4 Beta 尝鲜,React Windowing 与 setState 分析,Web Worker 实战

    前端每周清单专注前端领域内容,以对外文资料的搜集为主,帮助开发者了解一周前端热点:分为新闻热点.开发教程.工程实践.深度阅读.开源项目.巅峰人生等栏目.欢迎关注[前端之巅]微信公众号(ID: fron ...

  5. 尝鲜刚发布的 SpringFox 3.0.0,以前造的轮子可以不用了...

    最近 SpringFox 3.0.0 发布了,距离上一次大版本2.9.2足足有2年多时间了.可能看到这个名字,很多读者会有点陌生.但是,只要给大家看一下这两个依赖,你就知道了! <depende ...

  6. Spring Native 项目,把 Spring 项目编译成原生程序!

    Spring Native 是什么 优点 缺点 原生镜像(native image)和常规 JVM 程序的区别 前置条件:GraalVM 支持的语言 关键特性 GraalVM 下的 Java 微服务 ...

  7. Spring Native实战(畅快体验79毫秒启动springboot应用)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  8. spring native 初体验实现 小米控制美的空调

    目前关于 spring native 分享的文章还比较少 写这篇文章的主要目前是分享一下自己写的一个 小米控制美的空调 的程序 集成 spring native 过程中碰到的一些问题和解决方法 先放地 ...

  9. Windows 10 周年版尝鲜

    早在今年的 Build 大会上,微软就开始宣传最新的 Windows 10 周年版更新,炫了不少特技,直到昨天(2016/8/2 PST)才正式放出,相关新闻可以参考这里,正式的版本为 Version ...

  10. 小程序新能力-个人开发者尝鲜微信小程序

    个人开发者的福利 微信小程序,刚听到这个新名词的时候,我就兴冲冲的去找入口,看看自己能不能搞个微信小程序的HelloWorld,毕竟能在微信上把自己写的一些小工具跑起来还是满炫酷的. 没想,网上一查, ...

随机推荐

  1. 关于引用JS和CSS文件刷新浏览器缓存问题,部署服务器后客户端样式不刷新

    问题描述 对样式的css文件进行了修改,部署到服务器后访问发现页面展示不正常,但是刷新之后就会展示正常. 问题分析 研究之后发现可能的原因有 css文件过大,加载缓慢 本地缓存问题,虽然服务器修改了c ...

  2. 深度剖析Java的volatile实现原理,再也不怕面试官问了

    上篇文章我们讲了synchronized的用法和实现原理,我们总爱说synchronized是重量级锁,volatile是轻量级锁.为什么volatile是轻量级锁,体现在哪些方面?以及volatil ...

  3. pytorch 环境配置

    一.下载Anaconda 二.添加清华镜像 # 添加清华镜像 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anac ...

  4. 支持向量机(SVM)公式整理

    支持向量机可以分为三类: 线性可分的情况 ==> 硬间隔最大化 ==> 硬间隔SVM 近似线性可分的情况 ==> 软间隔最大化 ==> 线性支持向量机 线性不可分的情况 ==& ...

  5. 2流高手速成记(之八):基于Sentinel实现微服务体系下的限流与熔断

    我们接上回 上一篇中,我们进行了简要的微服务实现,也体会到了SpringCloudAlibaba的强大和神奇之处 我们仅改动了两个注释,其他全篇代码不变,原来的独立服务就被我们分为了provider和 ...

  6. 【题解】CF45I TCMCF+++

    题面传送门 题目描述 有 \(n\) 个数 \(a_i\) 请你从中至少选出一个数,使它们的乘积最大 解决思路 对于正数,对答案一定有贡献(正数越乘越大),所以输入正数时直接输出即可. 对于负数,如果 ...

  7. SCI简介和写作顺序

    一.SCI论文组成部分简介 一篇完整的 sci 论文主要包括以下几个主要的组成部分,从前往后依次分别是 Title 就是说这个文章的标题其次是 Abstract 也就是这个文章的摘要.接下来是 Int ...

  8. [论文阅读] 颜色迁移-EM概率分割的局部颜色迁移

    颜色迁移-EM概率分割的局部颜色迁移 文章: Local Color Transfer via Probabilistic Segmentation by Expectation-Maximizati ...

  9. 算法5: LeetCode_单链表_两数相加

    题目: * 给你两个 非空 的链表,表示两个非负的整数.它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字. * 请你将两个数相加,并以相同形式返回一个表示和的链表. * 你可 ...

  10. 10 STL-list

    ​ 重新系统学习c++语言,并将学习过程中的知识在这里抄录.总结.沉淀.同时希望对刷到的朋友有所帮助,一起加油哦!  生命就像一朵花,要拼尽全力绽放!死磕自个儿,身心愉悦! 写在前面,本篇章主要介绍S ...