gradle spring 编译很慢(GraalVM和Spring Native尝鲜,一步步让Springboot启动飞起来,66ms完成启动)
简介
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 --version openjdk 11.0.17 2022-10-18 OpenJDK 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-image Downloading: Component catalog from www.graalvm.org Processing Component: Native Image Downloading: Component native-image: Native Image from github.com Installing 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/Home alias 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 graalvm spring-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/pkslow-samples
References:
Quick Start Guide
GraalVM Quick Reference
GraalVM Native Image Quick Reference v1
向云原生靠近 | 体验 GraalVM 静态编译字节码 ,尝试 “超声波 Java ” - Quarkus
创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!