Skip to content

Graal VM best practice, use Java to develop CLI, Desktop (Java FX), Web (Spring Boot) projects, and use native-image technology to statically compile Java code into independent executable files (native images).

License

Notifications You must be signed in to change notification settings

westinyang/java-graalvm-start

Repository files navigation

java-graalvm-start

English document

由 JetBrains 提供的 开源开发许可证 产品订阅

JetBrains logo

介绍

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

插件变更

开发环境

以下是我本机的开发环境,理论上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

环境配置(Windows)

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/Mac)

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

有关不同平台配置和依赖更详细的说明,请参考:

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实现方式

技术交流

参考资料

About

Graal VM best practice, use Java to develop CLI, Desktop (Java FX), Web (Spring Boot) projects, and use native-image technology to statically compile Java code into independent executable files (native images).

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages