gpt4 book ai didi

Java Agent 对低版本目标 JVM 的支持

转载 作者:行者123 更新时间:2023-12-01 18:13:45 25 4
gpt4 key购买 nike

我目前正在使用 Instrumentation API 开发动态 Java 字节码代理,并观察到在 Java 11 上编写的 Java 代理只能将自身附加到 JVM 11,而不能附加到任何较低版本的 java 应用程序。为了在这里详细说明这个案例,我提到了两种情况。

场景1 我在java 11上开发了两个API作为生产者和消费者,并部署在Apache tomcat 9上(tomcat运行在JAVA 11上)。为了测试字节码注入(inject),我启动了在 Java 11 上运行的代理,发现代理能够将自身附加到正在运行的 JVM。

场景 2 我已经在 Apache tomcat 8.5 上部署了在 Java 8 上编译的消费者和生产者应用程序(tomcat 在 JAVA 8 上运行)。我启动了在 Java 11 上运行的代理,这次代理抛出了异常,如下所示

java.lang.UnsupportedClassVersionError: com/test/instrumentation/agent/TestAgent has been compiled by a more recent version of the Java Runtime (class file version 55.0), 
this version of the Java Runtime only recognizes class file versions up to 52.0
VirtualMachine vm = VirtualMachine.attach("some java process id");
String filePath = "C:\\test\\testagent-0.0.1-SNAPSHOT.jar";
vm.loadAgent(filePath, "some string");
vm.detach();

我遇到的问题是在调用 vm.loadAgent(filePath,"some string")

我知道这个错误与版本不匹配有关,但我的要求是我需要能够附加任何 JVM,无论其版本如何。有人可以解决这个问题吗?

最佳答案

如果您使用 java 8 编译代理,那么您将能够将它用于 java 8+ 中的任何应用程序。作为代理应该可以在目标虚拟机上加载。因此您应该使用所需的最低版本进行编译。
最好从与目标应用程序相同的版本运行代理注入(inject)器,但无论如何附加代理都会将代理加载到目标 jvm,所以这应该不会太重要。

关于Java Agent 对低版本目标 JVM 的支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60413614/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com