首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IntelliJ思想中的Java Agent (Instrumentation API) java.lang.NoClassDefFoundError在打包库时的应用

IntelliJ思想中的Java Agent (Instrumentation API) java.lang.NoClassDefFoundError在打包库时的应用
EN

Stack Overflow用户
提问于 2018-02-15 12:53:49
回答 1查看 901关注 0票数 0

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

下面是我正在使用的类:

代理主类:

代码语言:javascript
复制
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类:

代码语言:javascript
复制
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:(代理需要自定义清单)

代码语言:javascript
复制
Manifest-Version: 1.0
Premain-Class: poisonedporkchop.agent.Agent

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

IntelliJ项目设置:

Project Setup

Module Setup

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-17 08:27:51

通过乱搞,我发现这个问题的解决方案确实在于将库的源代码提取到您的jar中。

在IntelliJ IDEA中实现这一点的方法如下:

Right click your library in Artifacts and select this option

这样做可以让您在不获取任何NoClassDefFoundError的情况下使用库。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48800149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档