简介

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.

所以须要执行上面语句:

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

留神批改对应的目录。

而后就能够执行了:

$ ./java --versionopenjdk 11.0.17 2022-10-18OpenJDK Runtime Environment GraalVM CE 22.3.0 (build 11.0.17+8-jvmci-22.3-b08)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程序转化为本地二进制包,装置如下:

$ ./gu install native-imageDownloading: Component catalog from www.graalvm.orgProcessing Component: Native ImageDownloading: Component native-image: Native Image from github.comInstalling new component: Native Image (org.graalvm.native-image, version 22.3.0)

配置环境

配置环境变量

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

export GraalVM_HOME=/Users/larry/Software/graalvm-ce-java11-22.3.0/Contents/Homealias switchOnGraalVM='export PATH=$GraalVM_HOME:$PATH'alias switchOnGraalVMJavaHome='export JAVA_HOME=/Users/larry/Software/graalvm-ce-java11-22.3.0/Contents/Home'alias switchOffGraalVM='export PATH=`echo $PATH | tr ":" "\n" | grep -v "graalvm" | tr "\n" ":"`'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代码如下:

@SpringBootApplication@RestController@RequestMapping("/")public class SpringbootNativeGraalVMMain {    public static void main(String[] args) {        SpringApplication.run(SpringbootNativeGraalVMMain.class, args);    }    @GetMapping("/hi-graalvm")    public String hi() {        return "This message is from Spring Boot built/run by GraalVM/Spring Native";    }}

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

整合Spring Native

增加依赖:

<dependency>  <groupId>org.springframework.experimental</groupId>  <artifactId>spring-native</artifactId>  <version>${spring-native.version}</version></dependency>

增加插件,这个插件十分重要,不然会有各种谬误:

<build>  <plugins>    <plugin>      <groupId>org.springframework.experimental</groupId>      <artifactId>spring-aot-maven-plugin</artifactId>      <version>0.11.5</version>      <executions>        <execution>          <id>test-generate</id>          <goals>            <goal>test-generate</goal>          </goals>        </execution>        <execution>          <id>generate</id>          <goals>            <goal>generate</goal>          </goals>        </execution>      </executions>    </plugin>  </plugins></build>

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

<profiles>  <profile>    <id>native</id>    <properties>      <repackage.classifier>exec</repackage.classifier>      <native-buildtools.version>0.9.11</native-buildtools.version>    </properties>    <dependencies>      <dependency>        <groupId>org.junit.platform</groupId>        <artifactId>junit-platform-launcher</artifactId>        <scope>test</scope>      </dependency>    </dependencies>    <build>      <plugins>        <plugin>          <groupId>org.graalvm.buildtools</groupId>          <artifactId>native-maven-plugin</artifactId>          <version>${native-buildtools.version}</version>          <extensions>true</extensions>          <executions>            <execution>              <id>test-native</id>              <phase>test</phase>              <goals>                <goal>test</goal>              </goals>            </execution>            <execution>              <id>build-native</id>              <phase>package</phase>              <goals>                <goal>build</goal>              </goals>            </execution>          </executions>        </plugin>      </plugins>    </build>  </profile></profiles>

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

$ mvn clean package -Pnative

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

$ target/spring-boot-native-graalvm

后果只花了0.066秒,即66毫秒就能够了,这也太快了吧。

拜访接口也是失常的:

用Docker启动

先启动本地的Docker,而后增加依赖如下:

<plugin>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-maven-plugin</artifactId>  <configuration>    <classifier>${repackage.classifier}</classifier>    <image>      <builder>paketobuildpacks/builder:tiny</builder>      <env>        <BP_NATIVE_IMAGE>true</BP_NATIVE_IMAGE>      </env>    </image>  </configuration></plugin>

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

mvn spring-boot:build-image

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

打包胜利后,多了镜像:

$ docker images | grep graalvmspring-boot-native-graalvm                               1.0-SNAPSHOT                                     d2c8d5c52a3c        42 years ago        85.8MB 

启动如下:

$ 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/p...


References:

Quick Start Guide

GraalVM Quick Reference

GraalVM Native Image Quick Reference v1

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