java - 如何为java代理指定类路径

标签 java jvm jvm-hotspot

我正在编写一个 Java 代理来检测目标类的目标方法。

我使用 javassist 库来做仪器。

因此 java 代理(命名为 CnAgent.class)需要其依赖项:javassist 库才能运行。

目录层次是:

.
├── META-INF
│   └── MANIFEST.MF
├── com
│   └── yet
│       └── another
│           └── test
│               └── agent
│                   ├── CnAgent.class
│                   └── CnTransformer.class
└── lib
    └── javassist-3.18.2-GA.jar

MANIFEST.MF 文件内容为:

Manifest-Version: 1.0
Class-Path: lib/javassist-3.18.2-GA.jar .
Agent-Class: com.yet.another.test.agent.CnAgent
Created-By: 1.8.0_11 (Oracle Corporation)
Can-Retransform-Classes: true

我通过以下命令创建 jar 球:

jar cvfm CnAgent.jar META-INF/MENIFIEST.MF . lib

当我使用 JVM 的附加 API 加载代理时。 错误打印:

error when transform : javassist/ClassPool
java.lang.NoClassDefFoundError: javassist/ClassPool

这意味着代理代码无法找到 javassist 库。

所以我的问题是:

  1. 如何设置Agent库的类路径让它找到依赖?

  2. 为什么 MANIFEST.MF 中的 Class-Path 选项不起作用,它是否仅适用于直接在命令行中运行的 jar?

谢谢你的智慧:)

最佳答案

您可以使用选项 -Xbootclasspath:(设置路径)或 -Xbootclasspath/a:(将给定路径附加到现有引导类路径)(引用 doc from oracle )。但是,如链接中所述,它是非标准的。

作为替代方案,您可以在 %JAVA_HOME%/jre/lib/ext 目录中复制丢失的 jar 文件。

关于java - 如何为java代理指定类路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26280406/

相关文章:

Java 任务运行时

java - 反转链表

java - 有界缓冲区,互斥体与空的顺序。哪一个先出现

java.net.绑定(bind)异常 : Address already in use: JVM_Bind

java - 为什么 Java 开发人员应该学习一门额外的 JVM 语言?

java - 如何使用 HotSpot JVM @DontInline 注解?

java - CMS和ParNew可以同时运行吗?

java - 如何在 Android 中验证 Activity 后设置焦点 EditText?

java - websockets api中.sendText()和System.out.println有什么区别

java - 客户端导出对象时为 "java.rmi.ConnectException: Connection refused to host"