我正在编写一个 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 库。
所以我的问题是:
如何设置Agent库的类路径让它找到依赖?
为什么 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/