【问题标题】:ClassNotFoundException in Java Agent Instrumentation premainJava Agent Instrumentation premain 中的 ClassNotFoundException
【发布时间】:2022-01-18 23:19:56
【问题描述】:

我阅读了https://www.baeldung.com/java-instrumentation 并尝试在org.springframework.web.servlet.DispatcherServlet 中检测doService 方法,它是Spring Boot 框架的一部分,即spring-webmvc.jar

这是我启动 Spring Boot 应用程序的方式:

java -javaagent:agent.jar -jar myapp.jar

我了解我的代理的 pom.xml 应该打包/包含 javassist 依赖项,但我不希望代理应该打包/包含包含类 org.springframework.web.servlet.DispatcherServlet 的 jar spring-webmvc.jar,因为它已经打包并包含在myapp.jar

在代理的premain 中,当我尝试使用forName 检测和加载类org.springframework.web.servlet.DispatcherServlet 时,它会抛出ClassNotFoundException

我应该如何指示代理从myapp.jar 加载它?

谢谢!

        try {
            targetCls = Class.forName(className);
            targetClassLoader = targetCls.getClassLoader();
            LOGGER.log(Level.INFO, "Successfully obtain target class {0} and its classloader using 'forName' with class loader {1}", new Object[] {className, targetClassLoader.toString()});
        } catch (Exception ex) {
            LOGGER.log(Level.SEVERE, "Class {0} not found with Class.forName. {1}", new Object[] {className, ex.getClass().getCanonicalName()});
        }

【问题讨论】:

  • 为什么要手动加载类?在类加载期间注册一个 Instrumentation Transformer 并转换目标类还不够吗?此外,您的应用程序是哪种 JAR?一个或一个带有特殊类加载器的阴影之一,该类加载器可以动态地对 uber JAR 中的嵌套 JAR 进行本地化和解包?最好在 GitHub 上查看 MCVE 会有所帮助。尽可能减少它,同时它仍然会重现问题。
  • 感谢您为我指明正确的方向。没错,我不必手动加载类,我应该在premain 中注册转换器,然后在transform 方法中执行检测代码。

标签: java classloader instrumentation agent javaagents


【解决方案1】:

如果您不熟悉 Java 检测并遵循此 post,请注意在示例中手动调用 forName 不是必需的。您可以做的是在premain 中注册转换器,然后在transform 方法中,检查您的目标类名称并按照链接中的说明启动检测。编码愉快!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-23
    • 2023-03-25
    • 2016-10-05
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 2015-06-23
    相关资源
    最近更新 更多