You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot Native+GraalVM:使用追踪代理仍遇方法发现异常

更新:查看答案获取训练和构建原生镜像的正确(且更简单)步骤。

我一直在尝试创建无需手动添加任何配置的Spring Boot native构建流程,完全依赖GraalVM Tracing Agent自动发现所有依赖项。

原本一切正常,但当我在服务层加入了一个依赖反射的Jackson ObjectMapper手动调用后,GraalVM native-image构建镜像时失败,报错提示这个“隐藏”的方法——按道理它应该被追踪代理发现(见下文步骤3-5)。

[7/7] Creating image... (0.0s @ 3.14GB)

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 java.lang.String com.tlvlp.springnativedemo.AppendRequest.appendWith()

我猜测问题出在反射调用的提示未被收集,或是native-image工具没有读取到正确位置的提示,但已经没思路了,求指导。

版本信息:

  • Java 17
  • GraalVM 22.3.r17
  • Spring Boot 3.1.0(该版本理应修复了此前报告的类似问题)。

复现步骤

我准备了一个测试用的演示项目,根目录的脚本可触发相关步骤和训练,详情见项目README。

  1. 运行Spring Boot原生构建生成初始提示和类,否则追踪代理无法启动。(如果能省去这个开销就更好了)
mvn clean package -DskipTests -Pnative
  1. 将META-INF下生成的提示和类打包进jar
mvn package -DskipTests
  1. 启动追踪代理以追加现有提示
"$GRAALVM_HOME"/bin/java \
    -Dspring.aot.enabled=true \
    -agentlib:native-image-agent=config-merge-dir="$(pwd)"/target/classes/META-INF/native-image \
    -jar "$INPUT_JAR_PATH"
  1. 调用服务端点,让所有内部方法调用对追踪代理可见
  2. 停止追踪代理
  3. 将META-INF下生成的提示和类打包进jar
  4. 将jar解压到单独文件夹(遵循Spring Boot原生指南建议)
rm -rf "$NATIVE_BUILD_DIR"
mkdir -p "$NATIVE_BUILD_DIR"
cd "$NATIVE_BUILD_DIR" || exit 1
jar -xvf $INPUT_JAR_WITH_NATIVE_HINTS
  1. 运行native-image构建工具
"$GRAALVM_HOME"/bin/native-image \
--no-fallback \
-H:Name=$OUTPUT_EXECUTABLE_NAME \
-cp .:BOOT-INF/classes:`find BOOT-INF/lib | tr '\n' ':'` || exit 1

内容的提问来源于stack exchange,提问作者Péter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 12:49:55