Spring Boot 3.0.6升级后NativeTest出现GraalVM可达性分析错误求助
问题:Spring Boot 3.0.6原生编译nativeTest报错:静态分析后发现新的可达方法
使用Spring Boot、Gradlew 8.0.2、GraalVM CE 22.3.2进行原生编译开发项目,Spring Boot 3.0.5版本时运行正常,升级至3.0.6后执行nativeTest时触发如下错误;移除内部Osm记录后,scope字段出现类似错误。
错误日志
Fatal error: com.oracle.svm.core.util.VMError$HostedError: com.oracle.svm.core.util.VMError$HostedError: New Method or Constructor found as reachable after static analysis: public it.xxxxxx.reversebox.AppProperties$Osm it.xxxxxx.reversebox.AppProperties.osm() at org.graalvm.nativeimage.builder/com.oracle.svm.core.util.VMError.shouldNotReachHere(VMError.java:72) at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGenerator.doRun(NativeImageGenerator.java:696) at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGenerator.run(NativeImageGenerator.java:535) at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGeneratorRunner.buildImage(NativeImageGeneratorRunner.java:403) at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGeneratorRunner.build(NativeImageGeneratorRunner.java:580) at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGeneratorRunner.main(NativeImageGeneratorRunner.java:128) Caused by: com.oracle.svm.core.util.VMError$HostedError: New Method or Constructor found as reachable after static analysis: public it.xxxxxx.reversebox.AppProperties$Osm it.xxxxxx.reversebox.AppProperties.osm() at org.graalvm.nativeimage.builder/com.oracle.svm.core.util.VMError.shouldNotReachHere(VMError.java:68) at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.reflect.ReflectionFeature.getOrCreateAccessor(ReflectionFeature.java:121) at org.graalvm.nativeimage.builder/com.oracle.svm.core.reflect.target.ExecutableAccessorComputer.transform(ExecutableAccessorComputer.java:43) at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.substitute.ComputedValueField.computeValue(ComputedValueField.java:343) at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.substitute.ComputedValueField.readValue(ComputedValueField.java:313) at org.graalvm.nativeimage.builder/com.oracle.svm.core.meta.ReadableJavaField.readFieldValue(ReadableJavaField.java:38) at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.ameta.AnalysisConstantReflectionProvider.readValue(AnalysisConstantReflectionProvider.java:97) at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.meta.HostedField.readValue(HostedField.java:161) at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.image.NativeImageHeap.addObjectToImageHeap(NativeImageHeap.java:439) at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.image.NativeImageHeap.addObject(NativeImageHeap.java:295) ------------------------------------------------------------------------------------------------------------------------ at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.image.NativeImageHeap.processAddObjectWorklist(NativeImageHeap.java:598) at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.image.NativeImageHeap.addTrailingObjects(NativeImageHeap.java:198) at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGenerator.doRun(NativeImageGenerator.java:678) ... 4 more 36.6s (10.8% of total time) in 56 GCs | Peak RSS: 3.06GB | CPU load: 3.49
AppProperties代码定义
@ConfigurationProperties("app.xxxxx") public record AppProperties(String baseUrl, String authUrl, String waybillUrl, String pickupUrl, String clientId,String secretId, String scope, Osm osm) { public record Osm(String baseUrl, String url, String xApiKey) { } }
解决思路
- 检查Spring Boot 3.0.6配置属性原生支持变更:Spring Boot 3.0.6可能调整了
@ConfigurationProperties对record类型的原生镜像处理逻辑,查看官方release notes确认相关变更点。 - 手动添加反射元数据配置:创建
src/main/resources/META-INF/native-image/reflect-config.json文件,显式声明类的反射访问权限:
[ { "name": "it.xxxxxx.reversebox.AppProperties", "allPublicMethods": true }, { "name": "it.xxxxxx.reversebox.AppProperties$Osm", "allPublicMethods": true } ]
- 升级GraalVM版本:当前使用的GraalVM CE 22.3.2版本较旧,升级到与Spring Boot 3.0.6兼容的版本(如GraalVM CE 23.0.1+),新版本可能修复了静态分析阶段的反射可达性识别问题。
- 触发Spring Boot自动生成元数据:执行
./gradlew processAot命令,让Spring Boot自动生成原生镜像所需的元数据,覆盖手动配置的遗漏项,之后再运行nativeTest。 - 排查代码中的反射使用:检查项目中是否有通过反射访问AppProperties字段的逻辑,Spring Boot 3.0.6对record的属性访问优化可能导致静态分析未捕获这些路径,需手动标记这些反射调用。
内容的提问来源于stack exchange,提问作者user2210965
相关产品推荐
相关产品推荐

