如何在没有罐子的情况下附加代理?
How to attach agent without a jar?
(使用Java11)
我可以在运行时使用 jar 注入代理,通过:
VirtualMachine jvm = VirtualMachine.attach(jvmPid);
jvm.loadAgent("/path/to/agent.jar");
jvm.detach();
有什么方法可以在没有 jar 的情况下附加?
我可以用 byte-buddy
做到这一点,但是如果没有像 byte-buddy
这样的第三方库怎么办?
你必须有一个 jar 文件。
字节好友代理(byte-buddy-agent,不是byte-buddy jar)包含代理清单header 本身。在第一次尝试中,它会尝试在本地文件系统中找到自己的 jar(通过 getProtectionDomain().getCodeSource()
)。如果它不能执行此操作或作为文件夹中的 non-jar 文件存在,它会创建一个具有所需属性的临时 jar 文件。
byte-buddy-agent 是一个最小的 zero-dependency jar。我建议使用它作为附加的命名空间 API 在旧的 IBM 和 HotSpot VM 上不同,它需要在 Java 9+ 上进行不同的设置并且因为 Byte Buddy 可以在 non-JDK VM 上模拟附件如果 JNA 存在。 (免责声明:我是作者。)
(使用Java11)
我可以在运行时使用 jar 注入代理,通过:
VirtualMachine jvm = VirtualMachine.attach(jvmPid);
jvm.loadAgent("/path/to/agent.jar");
jvm.detach();
有什么方法可以在没有 jar 的情况下附加?
我可以用 byte-buddy
做到这一点,但是如果没有像 byte-buddy
这样的第三方库怎么办?
你必须有一个 jar 文件。
字节好友代理(byte-buddy-agent,不是byte-buddy jar)包含代理清单header 本身。在第一次尝试中,它会尝试在本地文件系统中找到自己的 jar(通过 getProtectionDomain().getCodeSource()
)。如果它不能执行此操作或作为文件夹中的 non-jar 文件存在,它会创建一个具有所需属性的临时 jar 文件。
byte-buddy-agent 是一个最小的 zero-dependency jar。我建议使用它作为附加的命名空间 API 在旧的 IBM 和 HotSpot VM 上不同,它需要在 Java 9+ 上进行不同的设置并且因为 Byte Buddy 可以在 non-JDK VM 上模拟附件如果 JNA 存在。 (免责声明:我是作者。)