带有 Glassfish 的 javassist - javassist.NotFoundException - 来自 springframework 的检测失败 class
javassist with Glassfish - javassist.NotFoundException - Failed instrumenting class from springframework
当使用 javassist 检测 com.sun.net.*
class 时,我可以成功使用 .insertAfter 方法。
但是,当尝试从 Glassfish 中的应用 运行 检测第三方 class 时,出现错误:
Failed instrumenting
com.app.class
agent.internal.javassist.CannotCompileException: cannot
find org.springframework.class
所以看起来 javaagent 能够获取 class 的字节码,但无法编译它,因为检测方法(来自 org.springframework
)的某些依赖项不能被发现。
这是一种不寻常的行为,因为人们会期望 javassist 将字节码简单地附加到检测方法中,而不必引用同一方法中引用的任何 classes。
我可以通过检查代理使用的 ClassPool 来调试问题:
ClassPool pool = new ClassPool();
pool.appendSystemPath();
CustomLogger.logText("Class pool: " + pool.toString());
导致:
Class pool: [class path:
my.java.agent.Transformer.class:java.lang.Object.class:]
然后我们可以将丢失的库 *.jar 的确切路径(在代理 运行 所在的机器上!)插入 class 池:
pool.insertClassPath("/path/to/glassfish/modules/missing-module.jar");
这导致:
Class pool: [class path:
file:/path/to/glassfish/modules/missing-module.jar:my.java.agent.Transformer.class:java.lang.Object.class:]
javassist 现在可以编译 class
当使用 javassist 检测 com.sun.net.*
class 时,我可以成功使用 .insertAfter 方法。
但是,当尝试从 Glassfish 中的应用 运行 检测第三方 class 时,出现错误:
Failed instrumenting com.app.class
agent.internal.javassist.CannotCompileException: cannot find org.springframework.class
所以看起来 javaagent 能够获取 class 的字节码,但无法编译它,因为检测方法(来自 org.springframework
)的某些依赖项不能被发现。
这是一种不寻常的行为,因为人们会期望 javassist 将字节码简单地附加到检测方法中,而不必引用同一方法中引用的任何 classes。
我可以通过检查代理使用的 ClassPool 来调试问题:
ClassPool pool = new ClassPool();
pool.appendSystemPath();
CustomLogger.logText("Class pool: " + pool.toString());
导致:
Class pool: [class path: my.java.agent.Transformer.class:java.lang.Object.class:]
然后我们可以将丢失的库 *.jar 的确切路径(在代理 运行 所在的机器上!)插入 class 池:
pool.insertClassPath("/path/to/glassfish/modules/missing-module.jar");
这导致:
Class pool: [class path: file:/path/to/glassfish/modules/missing-module.jar:my.java.agent.Transformer.class:java.lang.Object.class:]
javassist 现在可以编译 class