java - 解决使用javaagent命令时出现java.lang.NoClassDefFoundError异常

标签 java eclipse instrumentation javaagents

我想计算我创建的对象(名为 TreapDS 的包中的 Treap)的内存使用量。我发现我需要根据 this page 执行以下步骤。我总是使用 Eclipse,所以我不熟悉使用命令运行 Java 代码。我问了一个问题:如何基于 this page 中的该页面构建 jar 文件?但我没有收到任何答复。这是我的包的层次结构:

Indexing
| --- bin
|---- MemoryUsage
              | -- mainfest.MF
              |  -- Myagent
| --- src
       |--- treapDS
       |      |--- Treap
       |---- MemoryUsage
              | -- TestCase
              |  -- Myagent

我可以基于在这个地址运行命令来创建一个jar文件

Indexing/bin$ jar -cmf MemoryUsage/manifest.MF agent.jar MemoryUsage/MyAgent.class

它在bin文件夹中创建agent.jar,当我提取此jar文件时,它由两个文件夹MemoryUsage组成,其中包含Myagent.class和文件夹META-INF,其中包含MANIFEST.MF

但是当我运行以下命令时,我遇到了异常,并且我不知道如何通过提及 Treap 的地址来解决它。有没有办法用 Eclipse 来做到这一点?

/Indexing/bin$ java -javaagent:agent.jar -cp MemoryUsage/TestCase

Exception in thread "main" java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:386)
    at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:401)
Caused by: java.lang.NoClassDefFoundError: treapDS/Treap
    at MemoryUsage.MyAgent.premain(MyAgent.java:9)
    ... 6 more
Caused by: java.lang.ClassNotFoundException: treapDS.Treap
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 7 more
FATAL ERROR in native method: processing of -javaagent failed
Aborted (core dumped)

我阅读了这些页面1 2但我无法解决我的问题。

最佳答案

这是因为 treapDSTreapDS 不同。类名区分大小写!堆栈跟踪非常清楚:类加载器正在尝试加载 treapDS.Treap 而不是 TreapDS.Treap 并且前者不存在。

修复您的源代码并重新编译,以便在所有地方都具有正确的区分大小写的拼写,并且它应该消失。

大概第一次“一切都编译”的原因是因为您在没有正确区分大小写的文件路径的操作系统上进行开发。

关于java - 解决使用javaagent命令时出现java.lang.NoClassDefFoundError异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34834903/

相关文章:

java - 线程中的异常 "main"java.lang.IllegalArgumentException : setSelectedIndex: 4 out of bounds

maven - 如何从 Java (Spring boot) 应用程序向 Prometheus 公开指标

java - 如何检测java方法?

java - 为什么我的 ArrayList 中的对象数组无法保留它们的值?

java - 通过使用 Java 8 流对其进行排序将集合转换为 Map

java - 避免 SonarQube 空分配规则

java - 解决 Windows 上的 com.apple 导入错误

java - Hibernate 不使用由 Visual-Paradigm 生成的 DAO 对象保存在 DB 中

android - Maven Eclipse 插件不会将 Android support-v4 添加到构建路径

java - 使用 javaagents 在 Java 中进行基本 block 日志记录