【问题标题】: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 现在可以编译类

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多