java.lang.NoClassDefFoundError 当我的 Java 检测代理类尝试实例化 ClassFileTransformer

问题描述 投票:0回答:0

我浏览了一篇关于 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

对我遗漏的东西有什么想法吗?

java instrumentation javaagents
© www.soinside.com 2019 - 2024. All rights reserved.