GraalVM + SpringBoot 案例
1. 实验
- 安装
# 不建议使用低版本,打包可能出现不兼容问题
#curl -sSLk -O https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.0.0.2/graalvm-ce-java11-linux-amd64-22.0.0.2.tar.gz
curl -sSLk -O https://github.com/oracle/graal/releases/download/vm-19.2.1/graalvm-ce-linux-amd64-19.2.1.tar.gz
# 安装
tar -xf graalvm-ce-*
sudo mv graalvm-ce-*/* /usr/local/
/usr/local/graalvm-ce-*/bin/java -version
openjdk version "1.8.0_232"
OpenJDK Runtime Environment (build 1.8.0_232-20191008104205.buildslave.jdk8u-src-tar--b07)
OpenJDK 64-Bit GraalVM CE 19.2.1 (build 25.232-b07-jvmci-19.2-b03, mixed mode)
# 安装 native-image 构建插件
/usr/local/graalvm-ce-*/bin/gu install native-image
- 构建 native 执行文件
native-image \
-jar springboot-demo.jar \
-H:+ReportExceptionStackTraces \
-H:Class=org.springframework.boot.loader.JarLauncher \
--verbose \
--static \
--no-fallback \
--target $(uname)-$(uname -m) \
--report-unsupported-elements-at-runtime \
--initialize-at-build-time=org.springframework.util.unit.DataSize
- 注: 打包复杂项目为exec时,如果包含有大量反射等用法,可能很容易发生
ClassNotFound
错误,GraalVM 会通过静态分析提前编译来为Java应用程序构建高度优化的本机可执行文件,这就需要在编译时就知道所有的程序类型,而java中的反射、动态代理等功能,在编译时不确定具体的类型,所以在使用 GraalVM 构建 native image 前需要通过配置列出反射可见的所有类型。而程序内置提供了agentlib.
TODO
...