- Graalvm通过静态分析提前编译来为Java应用程序构建高度优化的本机可执行文件,这就需要在编译时就知道所有的程序类型,而java中的反射、动态代理等功能,在编译时不确定具体的类型,所以在使用GraalVm构建native image前需要通过配置列出反射可见的所有类型。反射的配置是一个json格式的文件。为了简化这种反射的配置,GraalVm提供agentlib工具,来辅助生成这个配置文件。
- 在使用agentlib生成配置时,建议将应用的测试用例全部跑一边,让应用覆盖到所有的业务接口,不然,生成的配置可能覆盖不到所有的反射类
- 在执行期间,代理与Java VM交互以拦截所有查找类,方法,字段,资源或请求代理访问的调用。然后,代理生成的文件jni-config.json,reflect-config.json,proxy-config.json、resource-config.json在指定的目录输出。生成的文件是JSON格式的独立配置文件,其中包含所有拦截的动态访问。
- Reflection配置文档:https://github.com/oracle/REFLECTION.md
- agetnlib文档:https://www.graalvm.org/reference-manual/native-image/BuildConfiguration/#assisted-configuration-of-native-image-builds
一个简单的Demo
- Demo路径:https://github.com/Gloduck/graalvm-demo
- 一个读取文件的一个demo,读取类路径下的
config.json
并且输出。
1 |
|
如图,直接编译是无法输出的。
这时候可以通过agentlib工具来进行分析,首先先将jar包进行打包,然后运行分析工具。
1 |
|
接着分析出来的文件会出现在配置的输出路径里,接着将这些文件全部复制到项目的resource/META-INF/native-image
路径下。
然后重新运行打包,结果就能输出了。
- MAVEN中打包使用命令
mvn -DskipTests -Pnative package