在第一次创建和使用代理时,我成功了。我创建了一个基本的Java应用程序来使用我的代理进行调试,我的代理如期收到了字节码。然后,我在我的项目库中添加了javassist,并添加了一些相关的代码来使用javassist。我将javassist添加到我的工件中(使用IntelliJ IDEA),这样它将与我的代理一起打包到jar中。我发现在我的代码中对javassist进行了更改之后,什么也没有发生。然后,我继续使用print语句进行调试,发现代码确实没有运行。知道了这一点,我在代码周围放了一个try catch语句,并发现在我的java代理中发生了一个java.lang.NoClassDefFoundError,如果没有try catch语句,它就不会被广播。在此之后,我尝试用简单的代码制作我自己的小库jar,当它与我的代理打包时也不起作用。试了又试,我甚至不能让我的代理使用放置在代理的jar旁边的库。我能想到的唯一办法就是将库的源代码直接放到我的项目中并使用它。
下面是我正在使用的类:
代理主类:
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);
}
}Agent Transformer类:
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:(代理需要自定义清单)
Manifest-Version: 1.0
Premain-Class: poisonedporkchop.agent.AgentIntelliJ IDEA版本: 2017.2.6 (内部版本172.4574.11)
IntelliJ项目设置:
我不知道该怎么办。请注意,我已经将库添加到工件中的jar中,正如许多与我的问题类似的解决方案所说的那样。任何指导都将不胜感激。
发布于 2018-02-17 08:27:51
通过乱搞,我发现这个问题的解决方案确实在于将库的源代码提取到您的jar中。
在IntelliJ IDEA中实现这一点的方法如下:
Right click your library in Artifacts and select this option
这样做可以让您在不获取任何NoClassDefFoundError的情况下使用库。
https://stackoverflow.com/questions/48800149
复制相似问题