由于某种原因,当我在IDEA中运行程序并通过IDEA VM选项添加代理jar时,我的Java代理的premain
被执行了两次:
我有以下示例程序,并通过以下方式在IDEA中添加了Java代理:Run Configuration
-> VM options
:-javaagent:/path/to/agent/MyJavaAgent.jar
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
解决方法是到disable the run delegation to Gradle。
我有reported a bug,可以关注更新。