[使用javassist来检测com.sun.net.*
类时,我可以成功使用.insertAfter方法。但是,当尝试从Glassfish中运行的应用程序检测第三方类时,出现错误:
检测失败 com.app.class
agent.internal.javassist.CannotCompileException:不能 找到org.springframework.class
因此,看起来javaagent能够提取该类的字节码,但无法编译它,因为找不到所检测方法的某些依赖项(来自org.springframework
)。
这是不寻常的行为,因为人们希望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现在可以编译该类