"No compatible attachment provider is available" 是什么意思

What does "No compatible attachment provider is available" mean

最近我使用 byte buddy 开发了一个 java 代理。在eclipse中开发没问题,然后我把agent放到production,消息:

No compatible attachment provider is available

连同来自行

的一些堆栈跟踪
static {
  ByteBuddyAgent.install();
}

经过一番调试,我发现了问题所在。如果使用 jre 而不是 jdk.

调用代理,则会出现消息 "No compatible attachment provider is not available"

不幸的是,无论 java 是 jdk 还是 jre,调用 java -version 都不会 return(消息为两者显示 Java runtime Environment)。

在我的例子中 (OS:Windows) 这很棘手,因为较新的 jsdk-installations 将 C:\ProgramData\Oracle\Java\javapath 附加到系统路径,其中包含一个 jre 而不是一个jdk。先前添加的条目 %JAVA_HOME%/bin 通过此修改被隐藏。当我删除条目 C:\ProgramData\Oracle\Java\javapath 时一切正常。

我在使用 jlink 创建的最小 JRE 启动 Spring Boot 2.3 应用程序时遇到了同样的问题。它不会启动,并且会继续抛出以下堆栈跟踪:

Caused by: java.lang.IllegalStateException: No compatible attachment provider is available
    at reactor.tools.shaded.net.bytebuddy.agent.ByteBuddyAgent.install(ByteBuddyAgent.java:602)
    at reactor.tools.shaded.net.bytebuddy.agent.ByteBuddyAgent.install(ByteBuddyAgent.java:586)
    at reactor.tools.shaded.net.bytebuddy.agent.ByteBuddyAgent.install(ByteBuddyAgent.java:538)
    at reactor.tools.shaded.net.bytebuddy.agent.ByteBuddyAgent.install(ByteBuddyAgent.java:515)
    at reactor.tools.agent.ReactorDebugAgent.init(ReactorDebugAgent.java:56)

我发现这个 ByteBuddyAgent(来自 this link)需要包含 java 模块 jdk.attach,而在我的最小 JRE 中并非如此。

--add-modules 下将 jdk.attach 模块添加到我的 jlink 命令后,错误消失了,我可以再次启动我的 Spring 启动应用程序。