目前,我正在使用Instrumentation开发动态Java,并注意到在ByteCode 11上编写的Java只能与JVM11连接,而不能使用任何较低版本的ByteCode应用程序。为了在此详细说明这一情况,我谨提及两种情况。
场景1我作为生产者和使用者在 11上开发了两个API,并部署在Apache 9上( tomcat运行在Java11上)。为了测试字节码注入,我启动了运行在Java 11上的代理,并发现该代理能够与正在运行的JVM连接。
场景2我已经在Java8上部署了消费者和生产者应用程序,在ApacheTomcat8.5上编译(tomcat在Java8上运行)。我启动了运行在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版本如何,我都需要能够附加任何JVM。有没有人在这个问题上有工作要做?
发布于 2020-02-26 14:14:53
如果您使用java 8编译代理,那么您就可以在java 8+中的任何应用程序中使用它。作为代理,应该可以在目标VM上加载。因此,您应该使用最低需要的版本进行编译。
最好是从目标应用程序的相同版本中运行代理注入器,但是无论如何,附加代理会将代理加载到目标jvm上,所以这并不重要。
https://stackoverflow.com/questions/60413614
复制相似问题