如何做京东商城一样的网站,wordpress js错误,营业执照年报入口,工厂管理软件曾今Go语言里让我最艳羡的两个特性#xff0c;一个是Goroutine#xff0c;一个是native编译。 Java 21的虚线程实现了类似Goroutine的能力。Spring Boot 3.x开始提供了GraalVM的支持#xff0c;现在Spring Boot也能打包成native文件了。
这一篇文章的目标是用一个案例讲解如…曾今Go语言里让我最艳羡的两个特性一个是Goroutine一个是native编译。 Java 21的虚线程实现了类似Goroutine的能力。Spring Boot 3.x开始提供了GraalVM的支持现在Spring Boot也能打包成native文件了。
这一篇文章的目标是用一个案例讲解如何将Spring Boot应用打包成native文件。整个过程主要是4步:
环境准备讲解怎么安装GraalVM安装本地编译器(gcccl)测试工程创建一个极简的Spring Boot应用只有个Controller编译打包使用GraalVM、Maven将Spring Boot应用构建成可执行文件测试运行执行生成的可执行文件访问Controller看是否正常
1. 环境准备
1. 前置条件
GraalVM依赖一些本地工具才能完成工作这些工具包括:
C的头文件glibc-develzlibgcclibstdc-static
不同的操作系统采用的安装方式不同在Linux下可以使用包管理工具安装比如yum、apt等
Linux
yum install gcc glibc-devel zlib-devel
apt-get install build-essential libz-dev zlib1g-dev
Windows
Windows可以通过安装Visual Studio完成依赖包安装
安装Visual Studio Build Tools安装Visual Studio
2. 安装GraalVM
从官网选择Java版本、平台来下载下载的zip包解压即安装接下来只要设置环境变量JAVA_HOME、PATH即可 设置GRAALVM_HOME为解压文件夹的根目录设置PATH为解压文件夹下的bin
3. 验证安装
通过执行native-image --help确认我们安装成功 4. 参考资料
关于GraalVM的安装过程可以参考官方的Get Started文档: Getting Started with GraalVM
2. 测试工程
1. 创建工程
使用mvn archetype:generate根据archetype maven-archetype-quickstart生成一个最简单的Java项目。
mvn archetype:generate -DarchetypeGroupIdorg.apache.maven.archetypes -DarchetypeArtifactIdmaven-archetype-quickstart -DarchetypeVersion1.4 -DgroupIdcom.keyniu.dis -DartifactIdDiveInSpring -Dversion0.1 -Dpackagecom.keyniu.dis -DinteractiveModefalse
2. 添加Spring Boot支持
修改pom.xml选择spring-boot-starter-parent作为parent添加native-maven-plugin插件
?xml version1.0 encodingUTF-8?project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdcom.keyniu.dis/groupIdartifactIdDiveInSpring/artifactIdversion0.1/versionnameDiveInSpring/nameparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion3.3.0/version/parentpropertiesproject.build.sourceEncodingUTF-8/project.build.sourceEncodingmaven.compiler.source17/maven.compiler.sourcemaven.compiler.target17/maven.compiler.target/propertiesdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.11/versionscopetest/scope/dependency/dependenciesbuildpluginsplugingroupIdorg.graalvm.buildtools/groupIdartifactIdnative-maven-plugin/artifactId/plugin/plugins/build/project3. 添加测试类
写一个最简单启动引导类提供一个最简单的接口/hello用于后续测试。
package com.keyniu.dis;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;SpringBootApplication
RestController
public class DiveInMain {GetMapping(/hello)public String hello(RequestParam(name) String name) {return hello, name;}public static void main(String[] args) {SpringApplication.run(DiveInMain.class);}
}3. 编译打包
1. 命令行窗口
为了让GraalVM能引用到VisualStudio的编译工具我选择在x64 Native Tools窗口中运行接下来的命令。 在执行命令之前确保你的环境变量设置正确有添加GraalVM相关的配置
set GRAALVM_HOMED:\Programs\GraalVM
set PATHD:\Programs\GraalVM\bin;%PATH%
2. 进行native编译
在工程的根目录下执行mvn -Pnative native:compile进行编译最后会生成一个exe到工程的target目录下输入如下
D:\Workspace\DiveInSpringmvn -Pnative native:compile
...
Produced artifacts:D:\Workspace\DiveInSpring\target\DiveInSpring.exe (executable)
4. 测试运行
只需要在命令行里输入DiveInSpring.exe执行可以看到只需要0.063s就能完成启动这个项目如果通过java -jar启动的话大概耗时0.97s还是快了很多的。打包后的exe文件大小是80M。 通过curl命令验证接口正常提供服务 5. 使用建议
可以看到整个构建过程已经相当的顺畅从可执行文件的大小启动时间内存占用都于明显的提升应该说Spring GraalVM离成熟应用已经不远了。由于GraalVM使用了Closed World Optimization实际上这个可执行程序还是有一些限制的主要是:
Class初始化有些初始化会在build期间完成可以参考GraalVM文档: Class Initialization in Native Image反射和动态代理需要的编译期间完成不支持JNI如果有本地方法调用需要根据GraalVM提供的接口定制实现执行时无法访问字节码正常的debug、监控等用JVM TI实现的功能都不再可用
在SpringBoot中 像profiles、 条件配置、 Enable*等功能会受到影响而其实这些特性正在被广泛使用这些限制在完全解决之前实际使用还是有障碍的。关于可以执行文件的DEBUG、监控在GraalVM官网都已经有对应的文档但是将它和公司内部的监控报警做集成还有一段路要走已经看到黎明的曙光了。
A. 参考资料
GraalVM构建Swing应用使用GDB Debug由GraalVM构建的程序Debug Native Executables with GDB让可执行文件支持JFRBuild and Run Native Executables with JFR手动创建Spring Boot工程