IntelliJ IDEA - Java premain инструментария вызывается дважды при непосредственном запуске внутри IDE - PullRequest
1 голос
/ 24 марта 2020

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

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

1 голос
/ 24 марта 2020

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

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

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

...