IntelliJ IDEA - предварительный инструментарий Java вызывается дважды при непосредственном запуске внутри IDE

По какой-то причине premain часть моего Java-агента выполняется дважды, когда я запускаю программу внутри IDEA и добавляю jar- premain агента через параметры виртуальной машины IDEA:

У меня есть следующий пример программы и добавил агент Java в IDEA через
Run Configuration -> 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

Всего 1 ответ


Похоже, это связано с тем, как IntelliJ IDEA запускает ваш класс через Gradle, генерируя задачу на лету.

Обходной путь - отключить делегирование запуска Gradle .

Я сообщил об ошибке, за которой вы можете следить за обновлениями.