带有Glassfish的Javassist-javassist.NotFoundException-springframework的检测类失败

问题描述 投票:0回答:1

[使用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个回答
0
投票

这是不寻常的行为,因为人们希望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现在可以编译该类

© www.soinside.com 2019 - 2024. All rights reserved.