Получение «неправильного имени» NoClassDefFoundError при выполнении Java-программы из командной строки - PullRequest
18 голосов
/ 10 февраля 2011

У меня проблема при попытке выполнить мое 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;

Все отлично работает. Как мне решить проблему?

Ответы [ 6 ]

46 голосов
/ 21 августа 2012

Поскольку я нашел эти ответы неясными, вот что вам нужно сделать.Во-первых, если вы упаковываете свой код (т.е. ваши классы имеют ключевое слово 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 голосов
/ 10 февраля 2011

Попробуйте (скомпилируйте и запустите):

реж

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

2 голосов
/ 10 февраля 2011

Попробуйте использовать:

java es_2011.ProgAudioJ

(вместо java ProgAudioJ).

Здесь я делаю некоторые предположения относительно вашего текущего рабочего каталога и вашего CLASSPATH.Если вы можете предоставить информацию о выполняемой вами команде (например, в каком каталоге вы находитесь, где находится файл класса и т. Д.), Мы можем помочь вам более эффективно.

1 голос
/ 10 февраля 2011

Там довольно четко указано:

java.lang.NoClassDefFoundError: ProgAudioJ (неправильное имя: es_2011 / ProgAudioJ)

Если вы хотите поместить класс впакет (*), тогда исходный код должен быть помещен в соответствующий каталог, например,

src/Main.java <- root package (no declaration)
src/es_2011/ProgAudioJ.java <- package es_2011;

(*) Вы должны делать это всегда, за исключением крошечных одноразовых вещей и, возможно,для основного класса.

0 голосов
/ 03 мая 2013

Попробуйте это,

  1. Скомпилируйте ваш класс, используя следующую команду

    $ javac ProgAudioJ.java -d .
    
  2. Запустите ваше приложение с помощью команды

    $ java es_2011.ProgAudioJ
    
0 голосов
/ 22 августа 2012

Причина, по которой он работает при удалении
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).

...