【发布时间】:2018-12-04 00:26:23
【问题描述】:
我正在编写一个 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 库。
所以我的问题是:
如何设置代理库的类路径,让它找到依赖关系?
为什么 MANIFEST.MF 中的 Class-Path 选项不起作用,它只适用于直接在命令行中运行的 jar 吗?
感谢你的智慧:)
【问题讨论】:
-
尝试使用
Boot-Class-Path代替Class-Path(不带点.)。 -
警告:javassist-3.18.2-GA.jar 未添加到引导类加载器搜索:非法参数或不是 JAR 文件
标签: java jvm jvm-hotspot