Spring + GraalVM即使在运行跟踪代理后也会抛出new method found异常

rur96b6h  于 2023-06-29  发布在  Spring
关注(0)|答案(1)|浏览(144)

更新:请参阅答案,了解训练和构建本机映像的正确(且简单得多)步骤。
我一直在尝试创建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()

我认为问题可能是反射调用的提示没有被收集,或者它们没有被本地映像工具收集到正确的位置,但是我已经没有办法尝试了,所以我感谢任何指导。

版本号:

复制步骤

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
jhkqcmku

jhkqcmku1#

这个错误与AppendRequest使用“record”有关,如果你检查github问题,你会看到有时它不能用graalvm运行very friendly,在我将其转换为下面的类后,一切都按预期工作。

package com.tlvlp.springnativedemo;

import jakarta.validation.constraints.NotEmpty;
import lombok.Data;

@Data
public class AppendRequest {
        @NotEmpty
        String appendWith;
}

为了跟踪我使用下面的命令

java -agentlib:native-image-agent=config-output-dir=./src/main/resources/META-INF/native-image/ -jar target/native-test.jar

用于生成所使用的本机映像

mvn -Pnative native:compile

用于调用服务

curl -X 'POST'   'http://localhost:8080/append'   -H 'accept: application/json'   -H 'Content-Type: application/json'   -d '{}'

React

{"appended":"START-null"}

和服务器端日志

相关问题