簡體   English   中英

ByteBuddy java 代理導致 noclassdeffound 錯誤

[英]ByteBuddy java agent results in noclassdeffound error

對於使用 Bytebuddy 編寫的簡單代理,我收到以下錯誤。 我有一個簡單的演示應用程序,它基於 spring 引導並嘗試使用下面的簡單 java 代理代碼片段運行它。

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");
    }
}

聚甲醛

<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

我假設您創建了一個 jar 文件,其中包含作為代理的類並包含premain方法。 由於您使用的是 Maven,因此默認情況下,您的項目依賴項將不包含在此創建的 jar 文件中。

You will need to create a fat jar (" uber jar ") that also contains Byte Buddy where Maven offers the Maven Shade plugin to do so.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM