我浏览了一篇关于 Java instrumentation api 的 baledung article,并尝试在我的机器上运行文章中的代码。
我基本上是在尝试做静态负载。我的代理代码无法从
ClassFileTransformer
方法实例化 premain
类,并因 NoClassDefFoundError
而失败
代码看起来像这样-
public class MyInstrumentationAgent {
public static void premain(String agentArgs, Instrumentation inst) {
// some stuff that is working fine
AtmTransformer dt = new AtmTransformer(clazz.getName(), classLoader); //fails here after unable to find AtmTransformer class
}
}
agent 类和 transformer 类在同一个 java 包中,我构建的 agent jar 包含
MyInstrumentationAgent.java
和 AtmTransformer.java
.
我使用以下命令运行代码 -
java -javaagent:core-java-jvm-0.0.1-SNAPSHOT-agent.jar -jar core-java-jvm-0.0.1-SNAPSHOT-application.jar
这是我得到的错误堆栈跟踪 -
Exception in thread "main" java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:513)
at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:525)
Caused by: java.lang.NoClassDefFoundError: javassist/NotFoundException
at com.baeldung.instrumentation.agent.MyInstrumentationAgent.transform(MyInstrumentationAgent.java:46)
at com.baeldung.instrumentation.agent.MyInstrumentationAgent.transformClass(MyInstrumentationAgent.java:28)
at com.baeldung.instrumentation.agent.MyInstrumentationAgent.premain(MyInstrumentationAgent.java:11)
... 6 more
Caused by: java.lang.ClassNotFoundException: javassist.NotFoundException
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
... 9 more
*** java.lang.instrument ASSERTION FAILED ***: "result" with message agent load/premain call failed at src/java.instrument/share/native/libinstrument/JPLISAgent.c line: 422
对我遗漏的东西有什么想法吗?