【发布时间】:2022-01-16 09:47:57
【问题描述】:
我正在尝试在模块化应用程序中运行javaagent,但我无法通过命令行使其工作。我已经创建了尽可能小的存储库:
.
├── Makefile
├── manifest
└── mods
├── main
│ ├── module-info.java
│ └── tsp
│ └── App.java
└── modifier
├── module-info.java
└── tsp
└── Agent.java
mods/main/module-info.java
module main {
}
mods/main/tsp/App.java
package tsp;
public class App {
public static void main(String[] args) {
}
}
mods/modifier/module-info.java
module modifier {
requires java.instrument;
}
mods/modifier/tsp/Agent.java
package tsp;
import java.lang.instrument.Instrumentation;
public class Agent {
public static void premain(String agentArgs, Instrumentation inst) {
}
}
生成文件
SHELL := /bin/bash
.PHONY: clean build_main build_agent run
build_agent: clean
echo -e "Premain-Class: tsp.Agent\nCan-Retransform-Classes: true\n" > manifest
javac --module-path mods/modifier -d output/modifier $$(find mods/modifier -name *.java) && \
jar --create --file output/modifier.jar --manifest manifest -C output/modifier .
build_main: clean
javac --module-path mods/main -d output/main $$(find mods/main -name *.java)
run: build_main build_agent
java -javaagent:output/modifier.jar --module-path output/main --module main/tsp.App
clean:
rm -rf output
manifest 是从Makefile 自动创建的。
当我执行make run时,输出为:
rm -rf output
javac --module-path mods/main -d output/main $(find mods/main -name *.java)
echo -e "Premain-Class: tsp.Agent\nCan-Retransform-Classes: true\n" > manifest
javac --module-path mods/modifier -d output/modifier $(find mods/modifier -name *.java) && \
jar --create --file output/modifier.jar --manifest manifest -C output/modifier .
java -javaagent:output/modifier.jar --module-path output/main --module main/tsp.App
Exception in thread "main" java.lang.ClassNotFoundException: tsp.Agent
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:606)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:168)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:431)
at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:525)
*** java.lang.instrument ASSERTION FAILED ***: "result" with message agent load/premain call failed at open/src/java.instrument/share/native/libinstrument/JPLISAgent.c line: 422
FATAL ERROR in native method: processing of -javaagent failed, processJavaStart failed
make: *** [Makefile:14: run] Aborted (core dumped)
相反,当我将Makefile 中的run 目标更改为:
run: build_main build_agent
java -javaagent:output/modifier.jar --class-path output/main tsp.App
一切都很完美。我不想使用 Gradle 或 Maven 之类的构建工具,因为我想了解它为什么不能从命令行运行。我已经阅读了Loading agent classes and the modules/classes available to the agent class,但老实说我并不完全清楚。我做了很多尝试,比如使用--add-modules output/modifier,但都没有成功。
> java --version
openjdk 15.0.2 2021-01-19
OpenJDK Runtime Environment (build 15.0.2+7-27)
OpenJDK 64-Bit Server VM (build 15.0.2+7-27, mixed mode, sharing)
【问题讨论】:
标签: java module instrumentation java-module javaagents