最近我使用byte buddy开发了一个java代理。eclipse 的开发很好,然后我将代理投入生产并传达消息:
No compatible attachment provider is available
以及一些源自行的堆栈跟踪
static {
ByteBuddyAgent.install();
}
经过一些调试,我发现了问题。如果使用 jre 而不是 jdk 调用代理,则会出现消息"没有兼容的附件提供程序不可用"。
不幸的是,调用java -version
不会返回java
是 jdk 还是 jre(消息显示Java runtime Environment
(。
就我而言(OS:Windows(,这很棘手,因为较新的jsdk安装C:ProgramDataOracleJavajavapath
附加到系统路径,其中包含jre而不是jdk。以前添加的条目%JAVA_HOME%/bin
通过此修改被隐藏。当我删除该条目时C:ProgramDataOracleJavajavapath
一切正常。
同样的问题,使用使用 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
(从这个链接(需要包含java模块jdk.attach
,而在我的最小JRE中并非如此。
在--add-modules
下将jdk.attach
模块添加到我的jlink
命令后,错误消失了,我可以再次启动我的 Spring 启动应用程序。