当直接在IDE中运行时,IntelliJ IDEA-Java指令插入premain会被调用两次



由于某种原因,当我在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的运行委派。

我报告了一个错误,您可以跟踪它进行更新。

最新更新