更新:请参阅答案,了解训练和构建本机映像的正确(且简单得多)步骤。
我一直在尝试创建Spring Boot native
构建步骤without manually adding any configuration
,完全依靠GraalVM Tracing Agent
来发现一切。
它工作得很好,直到我在服务层中“隐藏”了一个依赖于反射的手动Jackson调用。
然后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()
我认为问题可能是反射调用的提示没有被收集,或者它们没有被本地映像工具收集到正确的位置,但是我已经没有办法尝试了,所以我感谢任何指导。
版本号:
Java 17
GraalVM 22.3.r17
Spring Boot 3.1.0
(应该已经包含a similar issue reported earlier的修复)。
复制步骤
This is the demo project that I was experimenting on.详细信息在README中,步骤+培训由项目根目录中的脚本触发。
1.运行Sping Boot 原生构建以创建初始提示和类,否则跟踪代理将不会启动。(如果能消除这些开销就太好了)
mvn clean package -DskipTests -Pnative
1.将META-INF
下生成的hints +类打包到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.调用服务终结点以使每个内部方法调用对跟踪代理可见。
1.停止跟踪代理。
1.将META-INF
下生成的hints +类打包到jar中。
1.将jar解压缩到一个单独的文件夹中(如Sping 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.运行本机映像构建工具
"$GRAALVM_HOME"/bin/native-image \
--no-fallback \
-H:Name=$OUTPUT_EXECUTABLE_NAME \
-cp .:BOOT-INF/classes:`find BOOT-INF/lib | tr '\n' ':'` || exit 1
1条答案
按热度按时间jhkqcmku1#
这个错误与AppendRequest使用“record”有关,如果你检查github问题,你会看到有时它不能用graalvm运行very friendly,在我将其转换为下面的类后,一切都按预期工作。
为了跟踪我使用下面的命令
用于生成所使用的本机映像
用于调用服务
React
和服务器端日志