Получение "неправильного имени" 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.
Если я удалю из своего кода:
package es_2011;
Все работает отлично. Как решить проблему?
Ответы
Ответ 1
Потому что я нашел эти ответы неясными, вот что вам нужно сделать.
Во-первых, если вы упаковываете свой код (IE у ваших классов есть ключевое слово package
вверху), скомпилированные классы должны быть в каталоге с тем же именем, что и объявление вашего пакета в коде. После того, как вы скомпилировали свои классы, вам нужно переместить каталог, когда вы используете java-команду, а - имя пакета. Например, если ваш код существует в /myFolder/myPackage/
, а ваш класс начинается с 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
Ответ 2
Попробуйте использовать:
java es_2011.ProgAudioJ
(вместо java ProgAudioJ
).
Я делаю некоторые предположения здесь о вашем текущем рабочем каталоге и вашем CLASSPATH. Если вы можете предоставить информацию о команде, которую вы используете (например, какой каталог вы находитесь, где находится файл класса и т.д.), Мы можем помочь вам более эффективно.
Ответ 3
Попробуйте это (скомпилируйте и запустите):
папка
2011-02-10 00:30 <DIR> .
2011-02-10 00:30 <DIR> ..
2011-02-10 00:27 58 es_2011
javac es_2011/ProgAudioJ
java es_2011.ProgAudioJ
Ответ 4
Здесь четко сказано:
java.lang.NoClassDefFoundError: ProgAudioJ (неправильное имя: es_2011/ProgAudioJ)
Если вы хотите поместить класс в пакет (*), исходный код должен быть помещен в соответствующий каталог, например,
src/Main.java <- root package (no declaration)
src/es_2011/ProgAudioJ.java <- package es_2011;
(*) Вы должны делать это всегда, за исключением крошечных отбросов и, возможно, для основного класса.
Ответ 5
Причина, по которой она работает при удалении
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).
Ответ 6
Попробуйте это,
-
Скомпилируйте свой класс, используя следующую команду:
$ javac ProgAudioJ.java -d .
-
Запустите приложение по команде
$ java es_2011.ProgAudioJ