【问题标题】:javassist with Glassfish - javassist.NotFoundException - Failed instrumenting class from springframeworkjavassist with Glassfish - javassist.NotFoundException - 来自 springframework 的检测类失败
【发布时间】:2020-05-19 16:50:44
【问题描述】:
当使用 javassist 检测 com.sun.net.* 类时,我可以成功使用 .insertAfter 方法。
但是,当尝试从 Glassfish 中运行的应用程序检测第三方类时,出现错误:
检测失败
com.app.class
agent.internal.javassist.CannotCompileException: 不能
找到 org.springframework.class
所以看起来 javaagent 能够获取类的字节码,但无法编译它,因为无法找到检测方法的某些依赖项(来自 org.springframework)。
【问题讨论】:
标签:
java
bytecode
agent
javassist
javaagents
【解决方案1】:
这是一种不寻常的行为,因为人们期望 javassist 只需将字节码附加到检测方法,而不必引用同一方法中引用的任何类。
我可以通过检查代理使用的 ClassPool 来调试问题:
ClassPool pool = new ClassPool();
pool.appendSystemPath();
CustomLogger.logText("Class pool: " + pool.toString());
导致:
类池:[类路径:
my.java.agent.Transformer.class:java.lang.Object.class:]
然后我们可以将丢失的库 *.jar 的确切路径(在代理将运行的机器上!)插入到 classPool 中:
pool.insertClassPath("/path/to/glassfish/modules/missing-module.jar");
结果:
类池:[类路径:
文件:/path/to/glassfish/modules/missing-module.jar:my.java.agent.Transformer.class:java.lang.Object.class:]
javassist 现在可以编译类