英文:
How to attach agent without a jar?
问题
(使用Java 11)
我可以在运行时通过jar注入代理,如下所示:
VirtualMachine jvm = VirtualMachine.attach(jvmPid);
jvm.loadAgent("/path/to/agent.jar");
jvm.detach();
有没有一种方法可以在没有jar文件的情况下进行附加?我可以使用byte-buddy
来实现,但如何在没有第三方库(如byte-buddy
)的情况下实现呢?
英文:
(Using Java 11)
I could inject agent at runtime with jar, via:
VirtualMachine jvm = VirtualMachine.attach(jvmPid);
jvm.loadAgent("/path/to/agent.jar");
jvm.detach();
Is there any way to attach without a jar ?
I can do that With byte-buddy
, but how to do it without 3rd party libraries like byte-buddy
?
答案1
得分: 2
你必须拥有一个用于此的 JAR 文件。
Byte Buddy 代理(byte-buddy-agent,而不是 byte-buddy 的 JAR)包含代理清单头本身。在首次尝试中,它会尝试定位自己的 JAR 文件在本地文件系统中(通过 getProtectionDomain().getCodeSource()
)。如果无法执行此操作,或者存在于文件夹中作为非 JAR 文件,它将创建一个临时 JAR 文件,并附带所需的属性。
byte-buddy-agent 是一个精简的、零依赖的 JAR。我建议将其用作命名空间,以便于附加 API 在旧的 IBM 和 HotSpot VM 上有所不同,它在 Java 9+ 上需要不同的设置,而且由于 Byte Buddy 可以在存在 JNA 的非 JDK VM 上模拟附加。(免责声明:我是作者。)
英文:
You must have a jar file for this.
The Byte Buddy agent (byte-buddy-agent, not byte-buddy jar) contains the agent manifest header itself. In a first attempt, it tries to locate its own jar on the local file system (via getProtectionDomain().getCodeSource()
). If it cannot do this or exists as a non-jar file in a folder, it creates a temporary jar file with the required properties.
byte-buddy-agent is a minimal, zero-dependency jar. I'd recommend using it as namespaces for the attach API differ on old IBM and HotSpot VMs, it requires different setup on Java 9+ and since Byte Buddy can emulate attachment on non-JDK VMs if JNA is present. (Disclaimer: I am the author.)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论