由于某种原因,当我在IDEA内部运行程序并通过IDEA VM选项添加Agent jar时,我的Java Agent的premain
会执行两次:
我有以下示例程序,并通过Run Configuration
->VM options
:-javaagent:/path/to/agent/MyJavaAgent.jar
在IDEA中添加了Java Agent
package com.example;
public class Test {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
MyJavaAgent.jar
具有以下结构:
.
├── com
│ └── example
│ └── MyJavaAgent.class
└── META-INF
└── MANIFEST.MF
MyJavaAgent.java
package com.example;
import java.lang.instrument.Instrumentation;
public class MyJavaAgent {
private static int callCount = 0;
public static void premain(String agentArgs, Instrumentation inst) {
callCount++;
System.out.println("premain call " + callCount);
}
}
MANIFEST.MF
Manifest-Version: 1.0
Premain-Class: com.example.MyJavaAgent
Can-Redefine-Classes: true
Can-Retransform-Classes: true
Can-Set-Native-Method-Prefix: true
当我运行示例Test.main()
时,我得到以下输出:
> Task :Test.main()
premain call 1
premain call 2
Hello World!
当我在没有IDEA的情况下运行程序时,一切看起来都像预期的那样:
> java -javaagent:/path/to/agent/MyJavaAgent.jar com.example.Test
premain call 1
Hello World!
有人能解释一下这里发生了什么吗?这是IDEA的错误吗?
我正在使用IntelliJ IDEA 2019.3.4 (Ultimate Edition), Build #UI-193.6911.18
这似乎与IntelliJ IDEA如何通过Gradle启动您的类有关,即动态生成任务。
解决方法是禁用对Gradle的运行委派。
我报告了一个错误,您可以跟踪它进行更新。