带有 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