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 您可以关注我的更新。
出于某种原因,当我 运行 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 您可以关注我的更新。