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

问题描述 投票:1回答:1

由于某种原因,当我在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

java intellij-idea instrumentation javaagents
1个回答
1
投票
[这似乎与IntelliJ IDEA如何通过实时生成任务而通过Gradle启动课程有关。

解决方法是到disable the run delegation to Gradle

我有reported a bug,可以关注更新。

© www.soinside.com 2019 - 2024. All rights reserved.