【问题标题】:ByteBuddy java agent results in noclassdeffound errorByteBuddy java 代理导致 noclassdeffound 错误
【发布时间】:2021-05-08 02:41:54
【问题描述】:

对于使用 Bytebuddy 编写的简单代理,我收到以下错误。我有一个基于 Spring Boot 的简单演示应用程序,并尝试使用下面的简单 Java 代理代码 sn-p 运行它。

public static void premain(String agentArgs, Instrumentation inst) {
    System.out.println("Agent Loaded");
    new AgentBuilder.Default()
        .with(AgentBuilder.Listener.StreamWriting.toSystemOut())
        .type(hasSuperType(named("javax.sql.DataSource")))
        .transform((builder, type, classLoader, module) ->
            builder.visit(
                Advice.to(VariableAdvice.class).on(isMethod())
            )
        )
        .installOn(inst);
}

建议代码

import net.bytebuddy.asm.Advice;

public class VariableAdvice {
    @Advice.OnMethodEnter
    static void OnEnter() {
        System.out.println("Hello ByteBuddy");
    }
}

POM

<dependency>
    <groupId>net.bytebuddy</groupId>
    <artifactId>byte-buddy</artifactId>
    <version>1.10.19</version>
</dependency>

更多

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifestEntries>
                        <Premain-Class>com.abc.Agent</Premain-Class>
                        <Agent-Class>com.abc.Agent</Agent-Class>
                        <!-- <Main-Class>com.abc.Agent</Main-Class>-->
                        <Can-Redefine-Classes>true</Can-Redefine-Classes>
                        <Can-Retransform-Classes>true</Can-Retransform-Classes>
                    </manifestEntries>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>

在 Intellij 中出现以下错误

"C:\Program Files\Java\jdk1.8.0_261_deleteword\bin\java.exe" -
Exception in thread "main" java.lang.NoClassDefFoundError: net/bytebuddy/dynamic/DynamicType$Builder
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
    at java.lang.Class.getDeclaredMethod(Class.java:2128)
    at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:327)
    at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:401)
Caused by: java.lang.ClassNotFoundException: net.bytebuddy.dynamic.DynamicType$Builder
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
    ... 5 more
FATAL ERROR in native method: processing of -javaagent failed

【问题讨论】:

  • 我没有遇到使用 asm 编写的 java 代理的这种问题。我想,byte buddy 是在 asm 之上开发的?感谢您的快速回复。

标签: java sql classloader agent byte-buddy


【解决方案1】:

我假设您创建了一个 jar 文件,其中包含作为代理的类并包含 premain 方法。由于您使用的是 Maven,因此默认情况下,您的项目依赖项不会包含在此创建的 jar 文件中。

您需要创建一个 fat jar(“uber jar”),其中还包含 Byte Buddy,Maven 提供了 Maven Shade plugin 来执行此操作。

【讨论】:

  • 非常感谢您抽出宝贵时间,在我早期的 asm 模块中,这些类被打包在一起。没有检查这部分是否有 bytebuddy。现在可以了。
猜你喜欢
  • 2013-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-19
  • 1970-01-01
  • 2018-10-26
  • 1970-01-01
相关资源
最近更新 更多