由 JetBrains 提供的 开源开发许可证 产品订阅
GraalVM最佳实践,使用Java开发CLI、Desktop(JavaFX)、Web(SpringBoot)项目,并使用native-image技术把Java代码静态编译为独立可执行文件(本机映像)。
GraalVM让Java再次变得强大,使用native-image把程序编译为目标平台的可执行文件,脱离jvm直接运行,启动速度飞快,内存负载也很低。
体验我已经编译好的可执行文件(Windows、Linux、Mac),点此下载。
下面的性能测试结果是在我本机Windows上测试的,测试结果与机器配置有关,尤其是
native-image
编译耗时。
↓标签 \ 模块→ | cli-normal | desktop-javafx | web-springboot |
---|---|---|---|
模块描述 | 命令行应用(无框架) | 桌面应用(JavaFx) | Web应用(SpringBoot) |
JDK | 11 or 17 | 11 or 17 | 11 or 17 |
GraalVM | CE-21.3.0 | CE-21.3.0 | CE-21.3.0 |
Maven Plugin | native-maven-plugin | gluonfx-maven-plugin | spring-native |
启动耗时(jvm) | 0.713s | 2.555s | 1.793s |
启动耗时(native-image) | 0.047s | 0.665s | 0.216s |
内存负载(jvm) | 38.8m | 309.3m | 440.5m |
内存负载(native-image) | 3.1m | 60.4m | 70.2m |
编译耗时(native-image) | 24.786s | 93.455s | 99.434s |
可执行文件大小(7z压缩) | 8.03m (7z : 1.68m) | 62.7m (7z : 13.1m) | 66.5m (7z : 13.9m) |
新增模块
新增模块简单介绍和基本测试数据
- web-jlhttp
- 仅3000行Java代码实现的嵌入式HTTPServer,有些时候我们仅仅是想写一两个简单的接口打包发布,使用Spring等框架真的是觉得小题大做了。
- jarfile:
52k
,可执行文件大小:12.9m
, 7z:2.9m
- web-nanohttpd
- 另一种轻量级且设计良好的嵌入式HTTPServer实现,该库常用于Android应用开发,不过在这里配合GraalVM一样能正常使用。
- jarfile:
54k
,可执行文件大小:12.8m
, 7z:2.9m
- cli-picocli
- Picocli 是一个现代框架,用于轻松构建功能强大、用户友好、支持 GraalVM 的命令行应用程序。它支持颜色、自动补全、子命令等。
- jarfile:
676k
,可执行文件大小:18.2m
,7z:4.0m
- web-springboot3
- Spring Boot 3.0 已正式发布,支持 GraalVM native images,取代实验性的 Spring Native 项目。
- jarfile:
19.2m
,可执行文件大小:72.0m
,7z:16.4m
- 2021-03-05 GraalVM-21.0.0.2 (Java 8 or Java 11)
首次提交
- org.graalvm.nativeimage/native-image-maven-plugin:21.0.0.2
cli
- com.gluonhq/client-maven-plugin:0.1.38
javafx 15.0.1
- org.springframework.experimental/spring-graalvm-native:0.8.5
springboot 2.4.3
- org.graalvm.nativeimage/native-image-maven-plugin:21.0.0.2
- 2021-12-10 GraalVM-21.3.0 (Java 11 or Java 17)
- org.graalvm.buildtools/native-maven-plugin:0.9.8
cli
- com.gluonhq/gluonfx-maven-plugin:1.0.10
javafx 17.0.1
- org.springframework.experimental/spring-native:0.11.0
springboot 2.6.1
- org.graalvm.buildtools/native-maven-plugin:0.9.8
以下是我本机的开发环境,理论上windows、linux、mac都是支持的(注意不同平台的 GraalVM SDK 和 native-image的依赖是不一样的)。
- Windows 10 (CPU: i7-7700, RAM: 16G)
- IntelliJ IDEA 2020
- graalvm-ce-java11-21.3.0
- Visual Studio 2019
Graal VM
- 下载 Graal VM SDK
- 设置GraalVM环境变量(注意JAVA_HOME也要指向GRAALVM_HOME):
GRAALVM_HOME = C:\path\to\graalvm-ce-java11-21.3.0
JAVA_HOME = %GRAALVM_HOME%
PATH += %GRAALVM_HOME%\bin
- 验证环境
java -version
C:\Users\Administrator>java -version
openjdk version "11.0.13" 2021-10-19
OpenJDK Runtime Environment GraalVM CE 21.3.0 (build 11.0.13+7-jvmci-21.3-b05)
OpenJDK 64-Bit Server VM GraalVM CE 21.3.0 (build 11.0.13+7-jvmci-21.3-b05, mixed mode, sharing)
- 安装native-image组件
gu install native-image
- 验证组件
gu list
native-image --version
MSVC (Visual Studio 2019)
除了GraalVM,还需要Microsoft Visual Studio 2019。社区版就足够了,可以从这里下载。
在安装过程中,请确保至少选择以下各个组件:
- 选择英语语言包
- C++/CLI v142 构建工具(14.25或更高版本)
- MSVC v142 - VS 2019 C++ x64/x86 构建工具(v14.25或更高版本)
- Windows 通用 CRT SDK
- Windows 10 SDK(10.0.19041.0或更高版本)
所有构建命令(无论是Maven还是Gradle)都必须在名为的Visual Studio 2019命令提示符中执行
x64 Native Tools Command Prompt for VS 2019
。快捷方式可以在“开始菜单”中找到,也可以在搜索框中搜索应用程序。 阅读Microsoft文档以获取更多信息。另外,您可以执行
cmd.exe /k "<path to VS2019>\VC\Auxiliary\Build\vcvars64.bat
从任何其他终端运行,然后再开始使用构建命令。
推荐这个终极方案:Visual Studio 2019 配置 MSVC 环境变量,使用命令行编译,这样就可以在任何终端直接使用MSVC的编译工具。
一定要使用这个终极方案,否则在接下来的项目构建中,将会变得很麻烦,每次
mvn package
之前都要先执行cmd.exe /k "<path to VS2019>\VC\Auxiliary\Build\vcvars64.bat
。
Linux
下载GraalVM,配置环境变量,除了GraalVM,还需要以下软件包:
- gcc 6 或更高版本
- ld 2.26 或更高版本
- Ubuntu 18 还需要安装以下这些库(我在Linux子系统中已经测试通过):
sudo apt install pkg-config libgl-dev libglib2.0-dev libgtk-3-dev libpango1.0-dev libx11-dev libxtst-dev libasound2-dev libavcodec-dev libavformat-dev libavutil-dev
- Ubuntu 20 还需要安装以下这些库
sudo apt install g++-multilib
- 其他Linux发行版,请在打包时查看错误都缺少哪些依赖库,自行安装。
Mac
- xcode-select --install
有关不同平台配置和依赖更详细的说明,请参考:
- install-native-image
构建Java应用时参考
- gluon documentation
构建JavaFx应用时参考
tips:Gluon公司是
OpenJFX
项目和GraalVM
项目的贡献者,该公司提供了client-maven-plugin
封装了native-image
的相关命令,简化了打包操作。
- 通过上述步骤,你已经配置好了开发环境,还有一点需要注意的是,在IDEA开发工具中,你需要为项目设置JDK的时候应该直接指向GraalVM下的bin目录,而不是其他JDK的目录,否则在编译时可能会出现错误。
- GraalVM应该是不支持交叉编译的,不过可以利用Windows提供的Linux子系统来编译源码。
对于这三种应用的其他实现方式,后续可能会添加更多的模块
- cli-<支持解析args参数的库>
用于更快速的开发cli应用
- desktop-<Swing/AWT>
其他GUI实现方式
- web-<轻量级无容器的http-server库>
其他Web实现方式
- Q群:707416319
- 关于作者:I'm westinyang
- 官方资料
- 网络文章
- 如何评价 GraalVM 这个项目?
推荐阅读
- GraalVM:微服务时代的Java
推荐阅读
很全面的讲解
- 为 JavaFX 应用生成 native image
- Windows 下使用 GraalVM 将 JavaFX 应用编译成 exe
- Spring Boot as GraalVM Native Images
推荐阅读
可能需要“出国留学”工具
- Spring Boot GraalVM Native Image builds with the native-image-maven-plugin
推荐阅读
可能需要“出国留学”工具
- 如何借助 Graalvm 和 Picocli 构建 Java 编写的原生 CLI 应用
推荐阅读
- 如何评价 GraalVM 这个项目?