【问题标题】:When using Advice of byte buddy, Exception of java.lang.NoClassDefFoundError is throwed使用 byte buddy 的 Advice 时,抛出 java.lang.NoClassDefFoundError 异常
【发布时间】:2018-12-05 05:12:57
【问题描述】:

出于某种原因,我一直在分析我自己的旧 jar 文件(不幸的是源代码丢失了)。 我知道我要找到哪一部分,但不记得它在哪里。 所以决定使用byte buddy来获取jar文件的所有运行流程。记录所有类中所有方法的参数值和返回值就足够了(库类除外,例如 java.lang.*)。 我尝试了稍作修改的示例代码,但只有一个例外:

 public static void premain(final String agentArgs,
                           final Instrumentation inst) {
    System.out.println(
            "+++Hey, look: I'm instrumenting a freshly started JVM!");
    new AgentBuilder.Default()
            .type(ElementMatchers.any())
            .transform(new MetricsTransformer())
            .with(AgentBuilder.Listener.StreamWriting.toSystemOut())
            .with(AgentBuilder.TypeStrategy.Default.REDEFINE)
            .installOn(inst);
}

private static class MetricsTransformer implements AgentBuilder.Transformer {
    @Override
    public DynamicType.Builder<?> transform(
            final DynamicType.Builder<?> builder,
            final TypeDescription typeDescription,
            final ClassLoader classLoader,
            final JavaModule module) {

        final AsmVisitorWrapper methodsVisitor =
                Advice.to(EnterAdvice.class, ExitAdviceMethods.class)
                        .on(ElementMatchers.isAnnotatedWith(CollectMetrics.class)
                                .and(ElementMatchers.isMethod()));

        final AsmVisitorWrapper constructorsVisitor =
                Advice.to(EnterAdvice.class, ExitAdviceConstructors.class)
                        .on(ElementMatchers.isAnnotatedWith(CollectMetrics.class)
                                .and(ElementMatchers.isConstructor()));

        return builder.visit(methodsVisitor).visit(constructorsVisitor);
    }

    private static class EnterAdvice {
        @Advice.OnMethodEnter
        static long enter() {
            return System.nanoTime();
        }
    }

    private static class ExitAdviceMethods {
        @Advice.OnMethodExit(onThrowable = Throwable.class)
        static void exit(@Advice.Origin final Executable executable,
                         @Advice.Enter final long startTime,
                         @Advice.Thrown final Throwable throwable) {
            final long duration = System.nanoTime() - startTime;
            System.out.println(duration);;
        }
    }

}

byte buddy 的版本是 1.9.5, 1.7.11 jdk版本:1.8.0.191

和cmd中的异常:

    E:\>cd E:\workshop\_android_studio\BounAgent\out\artifacts\BounAgent_jar

E:\BounAgent_jar>java -javaagent:BounAgent.jar -jar untitled.jar
Exception in thread "main" java.lang.NoClassDefFoundError: net/bytebuddy/matcher
/ElementMatcher
        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
        at java.lang.Class.getDeclaredMethod(Unknown Source)
        at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(Unknown Sou
rce)
        at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(Unknown So
urce)
Caused by: java.lang.ClassNotFoundException: net.bytebuddy.matcher.ElementMatche
r
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 5 more

本机方法中的致命错误:-javaagent 处理失败

提前致谢。

【问题讨论】:

    标签: java byte-buddy javaagents


    【解决方案1】:

    根据an article我发现:

    要启动您的代理,您必须将代理类和资源捆绑在一个 jar 中,并在 jar 清单中将 Agent-Class 属性设置为包含 premain 方法的代理类的名称。 (代理必须始终捆绑为 jar 文件,不能以分解格式指定。)

    您的代理 JAR 文件(“BounAgent.jar”)似乎没有包含正确格式的所有依赖项。具体来说,bytebuddy 类不在 JAR 文件中。这导致代理类无法加载。

    【讨论】:

    • 好点,在我的 jar 文件中,没有依赖项。我试试看。
    • 嗯。但是你会同意堆栈跟踪告诉你 >>a
    • 我认为你是对的。[ Caused by: java.lang.ClassNotFoundException: net.bytebuddy.matcher.ElementMatcher ] 是一行堆栈跟踪。也许我没有正确构建 jar 存档。你能告诉我如何正确构建它吗?
    • 你用的是什么构建工具?
    • 我设法用标准的 maven 配置构建了 jar 文件。顺便说一句,我正在使用 eclips 和 intellij 的想法。但我现在有另一个问题。问题是——当 [java.lang.ClassLoader.loadClass] 从输入流读取字节数组并加载它时,bytebuddy 建议似乎出现异常。我希望它像之前的问题一样太琐碎,但我担心这是一个微妙的问题。我该如何解决?
    猜你喜欢
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多