Получение «неправильного имени» NoClassDefFoundError при выполнении программы Java из командной строки
У меня проблема при попытке выполнить мое приложение Java. Всякий раз, когда я пытаюсь выполнить программу с помощью команды
java ProgAudioJ
Я получаю эту ошибку:
Exception in thread "main" java.lang.NoClassDefFoundError: ProgAudioJ (wrong name: es_2011/ProgAudioJ) at java.lang.ClassLoader.defineClass1(NativeMethod) at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632) at java.lang.ClassLoader.defineClass(ClassLoader.java:616) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) at java.net.URLClassLoader.defineClass(URLClassLoader.java:283) at java.net.URLClassLoader.access$000(URLClassLoader.java:58) at java.net.URLClassLoader$1.run(URLClassLoader.java:197) at java.security.AccessController.doPrivileged(NativeMethod) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:307) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:248) Could not find the main class: ProgAudioJ. Program will exit.
Если я удалю из своего кода:
- Какие причины и каковы различия между NoClassDefFoundError и ClassNotFoundException?
- java.lang.NoClassDefFoundError: android / graphics / drawable / Icon
- Получение java.lang.ClassNotFoundException: исключение org.apache.commons.logging.LogFactory
- java.lang.NoClassDefFoundError: Не удалось инициализировать class XXX
- java.lang.NoClassDefFoundError: org / apache / spark / streaming / twitter / TwitterUtils $ во время работы TwitterPopularTags
package es_2011;
Все работает отлично. Как решить проблему?
- NoClassDefFoundError: неправильное имя
- java.lang.NoClassDefFoundError: org / hamcrest / SelfDescribing
- java.lang.NoClassDefFoundError в junit
- Как решить java.lang.NoClassDefFoundError?
- NoClassDefFoundError JsonAutoDetect при анализе объекта JSON
- Не удалось создать экземпляр android.gms.maps.MapFragment
- Почему NoClassDefFoundError вызвано сбоем инициализации статического поля?
- Почему я получаю NoClassDefFoundError в Java?
Поскольку я нашел эти ответы неясными, вот что вам нужно сделать. Во-первых, если вы упаковываете свой код (IE у ваших classов есть ключевое слово package
вверху), скомпилированные classы должны быть в каталоге с тем же именем, что и объявление вашего пакета в коде. После того, как вы скомпилировали свои classы, вам нужно переместить каталог, когда вы используете команду java , и включаете имя пакета . Например, если ваш код существует в /myFolder/myPackage/
, а ваш class начинается с package myPackage
(обратите внимание, что каталог и пакет имеют одинаковое имя), вы должны сделать следующее (linux / osx):
cd /myFolder/myPackage javac MyClass.java cd .. java myPackage.MyClass
Изменить – позднее редактирование, чтобы прояснить то, что я вижу, люди путаются. В приведенном выше примере пакет является только одним глубоким, что означает его просто myPackage. Если у вас код имеет больший пакет, например
package com.somedomain.someproject;
вам нужно будет выполнить команду java из каталога, который содержит корневую директорию для этого пакета. Например, если ваш скомпилированный код находится в myCode / com / somedomain / someproject / MyMainClass.class, тогда вы выполните команду java из папки myCode, как это (Еще раз обратите внимание, что структура каталогов такая же, как и пакет декларация):
cd /myCode java com.somedomain.someproject.MyMainClass
Попробуйте использовать:
java es_2011.ProgAudioJ
(вместо java ProgAudioJ
).
Я делаю некоторые предположения здесь о вашем текущем рабочем каталоге и вашем CLASSPATH. Если вы можете предоставить информацию о команде, которую вы используете (например, какой каталог вы находитесь, где находится файл classа и т. Д.), Мы можем помочь вам более эффективно.
Попробуйте это (скомпилируйте и запустите):
реж
2011-02-10 00:30 . 2011-02-10 00:30 .. 2011-02-10 00:27 58 es_2011
javac es_2011 / ProgAudioJ
java es_2011.ProgAudioJ
Здесь четко сказано:
java.lang.NoClassDefFoundError: ProgAudioJ (неправильное имя: es_2011 / ProgAudioJ)
Если вы хотите поместить class в пакет (*), исходный код должен быть помещен в соответствующий каталог, например,
src/Main.java <- root package (no declaration) src/es_2011/ProgAudioJ.java <- package es_2011;
(*) Вы должны делать это всегда, за исключением крошечных отбросов и, возможно, для основного classа.
Попробуй это,
-
Скомпилируйте свой class, используя команду ниже
$ javac ProgAudioJ.java -d .
-
Запустите приложение по команде
$ java es_2011.ProgAudioJ
Причина, по которой он работает, когда вы удаляете
package es_2011
заключается в том, что вы изменяете, как компилятор упаковывает и эффективно находит файл.
У меня была та же проблема – и сообщение об ошибке wrong name:
действительно указывает на ответ. Вы используете неправильное имя «ProgAudioJ» для запуска файла .class. Он был упакован как
es_2011 / ProgAudioJ
Чтобы запустить его – вам нужно либо переместиться вверх по каталогу:
Если вы находитесь здесь: (Windows) src\es_2011\
перейдите в src\
Затем запустите строку:
java es_2011.ProgAudioJ
Это говорит компилятору искать ProgAudioJ, который находится в пакете es_2011. Для стандартной установки это будет основано на папках – поэтому сначала будет искать папку es_2011, а затем имя файла .class, который вы хотите запустить (ProgAudio).