IDEA配置agent Boot-Class-Path踩坑记录

580 阅读1分钟

这是一篇简单的配置java agent时遇到问题记录集

Agent

自行搜索

IDEA配置AGENT项目

参考: www.jetbrains.com/help/idea/g…

在build.gradle中配置

// build.gradle
jar {
    manifest {
        attributes "Can-Redefine-Classes": true
        attributes "Can-Retransform-Classes": true
        attributes "Premain-Class": "com.test.HelloAgent"
    }

    from {
        configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
    }
}

其他项目中使用

IDEA中编辑配置 VM options中添加

-javaagent:"<path-to-agent.jar>"

ClassLoader问题

在agent transform过程中, 可能会在各个类中插入代码, 比如在java.lang引用agent jar中的一些类 此时直接运行被注入的程序, 可能会出现如下异常

Exception in thread "main" java.lang.NoClassDefFoundError: com/test/log/Logger

原因可以参考如下链接: stackoverflow.com/questions/2…

这里想要说明的是 在配置Boot-Class-Path时, 可以直接添加agent jar即可, 不用单独把agent中的代码再封装到一个单独的jar 注意这里的相对路径是该agent.jar所在的目录, 这非常重要,很容易就把Boot-Class-Path路径写错了

此外在Windows上,

 attributes "Boot-Class-Path": "D:\Practices\IDEA\HelloAgent\libs\HelloLog-1.0-SNAPSHOT.jar"

上面的路径是不支持的,

下面的路径是支持的

 attributes "Boot-Class-Path": "D:/Practices/IDEA/HelloAgent/libs/HelloLog-1.0-SNAPSHOT.jar"

大坑。。。