IntelliJ IDEA - Java 在 IDE 中直接 运行 时,仪器 premain 被调用两次

IntelliJ IDEA - Java instrumentation premain gets called twice when directly run inside IDE

出于某种原因,当我 运行 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

这似乎与 IntelliJ IDEA 如何通过 Gradle 动态生成任务来启动您的 class 有关。

解决方法是disable the run delegation to Gradle

reported a bug 您可以关注我的更新。