Устранить исключение java.lang.NoClassDefFoundError при использовании команды javaagent

Я хочу рассчитать использование памяти объектом (Treap в пакете с именем TreapDS), который я создал. Я обнаружил, что мне нужно выполнить следующие шаги на основе этой страницы. Я всегда использую Eclipse, поэтому я не знаком с запуском Java-кода с помощью команд. Я задал вопрос, как я могу создавать файлы 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

Он создает agent.jar в папке bin, и когда я извлекаю этот файл jar, он состоит из двух папок MemoryUsage, которые содержат Mygent.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, но я не смог решить свою проблему.


person Suri    schedule 17.01.2016    source источник


Ответы (1)


Это потому, что treapDS не совпадает с TreapDS. Имена классов чувствительны к регистру! Трассировка стека довольно ясна: загрузчик классов пытается загрузить treapDS.Treap вместо TreapDS.Treap, а первого не существует.

Исправьте свой исходный код и перекомпилируйте, чтобы везде было правильное правописание с учетом регистра, и это должно исчезнуть.

Предположительно причина, по которой «все скомпилировано» в первый раз, заключается в том, что вы разрабатываете ОС без правильных путей к файлам с учетом регистра.

person user268396    schedule 17.01.2016
comment
@Mike Samuel @ user268396 Имя пакета — treapDS во всей части моего кода. Я неправильно написал это в иерархии; прости за это. Как подготовить путь к файлу с учетом регистра? - person Suri; 17.01.2016