Java Agent (Instrumentation API) java.lang.NoClassDefFoundError in IntelliJ IDEA 打包库时

Java Agent (Instrumentation API) java.lang.NoClassDefFoundError in IntelliJ IDEA When Packaging Libraries

第一次创建和使用代理时,我成功了。我创建了一个基本的 Java 应用程序来使用我的代理进行调试,我的代理按预期收到了字节码。然后,我继续将 javassist 添加到我的项目库中,并添加了一些相关代码来使用 javassist。我将 javassist 添加到我的工件中(使用 IntelliJ IDEA),以便它与我的代理一起打包在 jar 中。我发现在我的代码中对 javassist 进行更改后,什么也没有发生。然后我继续用打印语句进行调试,发现代码确实不是运行。知道这一点后,我在代码周围放置了一个 try catch 语句,发现在我的 java 代理中发生了一个 java.lang.NoClassDefFoundError,如果没有 try catch 语句,它就不会被广播。在此之后,我尝试用简单的代码制作我自己的小库 jar,但与我的代理一起打包时它也不起作用。不断尝试,我什至无法让我的代理使用与代理 jar 一起放置的库。我能想到的唯一方法是将库的源代码直接放到我的项目中并使用它。

以下是我正在使用的类:

主代理Class:

package poisonedporkchop.agent;

import java.lang.instrument.Instrumentation;

public class Agent {
    public static void premain(String args, Instrumentation instrumentation){
        AgentClassTransformer transformer = new AgentClassTransformer();
        System.out.println("Injecting/editing jar...");
        instrumentation.addTransformer(transformer);
    }
}

代理变压器Class:

package poisonedporkchop.agent;

import testpackage.TestClass;

import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.security.ProtectionDomain;

public class AgentClassTransformer implements ClassFileTransformer {
    @Override
    public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] bytecode) throws IllegalClassFormatException {
        System.out.println("Class Received: " + className);
        if(className.equals("poisonedporkchop/testapp/Main"))
        {
            try {
                System.out.println("Main found!");
                System.out.println("Test if it it even getting here."); //Nothing after this works.
                TestClass test = new TestClass();
                System.out.println("T1");
                test.testMethod();
                System.out.println("T2");
                System.out.println(TestClass.testStatic);
                System.out.println("Test if it is getting to the end.");
            }
            catch (Throwable e)
            {
                e.printStackTrace();
            }
        }
        return bytecode;
    }
}

清单:(代理需要自定义清单)

Manifest-Version: 1.0
Premain-Class: poisonedporkchop.agent.Agent

IntelliJ IDEA 版本:2017.2.6(内部版本 172.4574.11)

IntelliJ 项目设置:

Project Setup

Module Setup

我不知道该怎么办。请注意,我已将库添加到工件中的 jar 中,正如许多与我的问题类似的解决方案所说的那样。任何指导将不胜感激。

我瞎折腾发现,问题的解决确实在于将库的源码解压到你的jar中。

在 IntelliJ IDEA 中执行此操作的方法如下:

Right click your library in Artifacts and select this option

这样做可以让您在使用库时不会收到任何 NoClassDefFoundError。