исключение в потоке 'main' java.lang.NoClassDefFoundError: - PullRequest
47 голосов
/ 13 июня 2011

Следующая программа выдает ошибку:

public class HelloWorld {
    public static void main(String args[]) {
        System.out.println("Hello World!"); 
    }
}

CLASSPATH C:\Program Files\Java\jdk1.6.0_18\bin\

Path C:\Program Files\Java\jdk1.6.0_18\bin\

JAVAHOME C:\Program Files\Java\jdk1.6.0_18\bin

Подскажите, пожалуйста, причину?

Ответы [ 21 ]

66 голосов
/ 02 ноября 2013

Я нашел еще одну распространенную причину.Если вы создадите файл Java внутри пакета, используя IDE, например eclipse, вы найдете имя пакета в верхней части вашего файла Java, например «package pkgName».Если вы попытаетесь запустить этот файл из командной строки, вы получите ошибку NoClassDefFoundError.Удалите имя пакета из файла Java и используйте команды в командной строке.На это потрачено 3 часа.Абхи

27 голосов
/ 13 июня 2011
Exception in thread "main" java.lang.NoClassDefFoundError  

Одним из мест, где java пытается найти ваш файл .class, является ваш текущий каталог.Так что, если ваш .class файл находится в C:\java, вы должны изменить текущий каталог на него.

Чтобы изменить каталог, введите в командной строке следующую команду и нажмите Enter:

cd c:\java  

Этот . сообщает Java, что ваш classpath является вашим локальным каталогом.*

14 голосов
/ 12 июня 2013

Если ваш пакет helloworld, вы перейдете к родительскому каталогу вашего пакета и запустите:

java helloworld.HelloWorld
11 голосов
/ 10 мая 2012

Запустите это так:

java -jar HelloWorld.jar
5 голосов
/ 29 августа 2013

См. http://scottizu.wordpress.com/2013/08/28/fixing-the-exception-in-thread-main-java-lang-noclassdeffounderror-in-eclipse/.

Это полная форма команд Java, которые можно запустить из командной строки Windows:

"C:\Program Files\Java\jdk1.6.0_18\bin\javac.exe" -classpath "C:\Users\Scott\workspace\myproject" com\mycompany\myapp\HelloWorld.java
"C:\Program Files\Java\jdk1.6.0_18\bin\java.exe" -classpath "C:\Users\Scott\workspace\myproject" com.mycompany.myapp.HelloWorld
  1. Эти команды можно запускать из любого каталога, то есть вам не обязательно находиться в каталоге, где находится файл HelloWorld.java.
  2. Первая строка компилирует ваш файл HelloWorld.java, создавая файл HelloWorld.class.
  3. Вторая строка запускает файл HelloWorld.class.
  4. -classpath указывает java, где искать указанный файл в каждой команде
  5. Компилятор Java (javac.exe) ожидает расположение файла Java относительно пути к классу (то есть файл находится в C: \ Users \ Scott \ workspace \ myproject \ com \ mycompany \ myapp \ HelloWorld.java )
  6. Java (java.exe) ожидает пакет (т. Е. Com.mycompany.myapp) и класс (HelloWorld) относительно пути к классу (т. Е. Файл находится в C: \ Users \ Scott \ workspace \ myproject \ com \ MyCompany \ MyApp \ HelloWorld.class)

Обратите внимание, что в конце пути к классам нет косой черты. Команды javac.exe ожидают, что файл оканчивается на «.java». Команда java.exe ожидает полное имя класса и не заканчивается на «.class».

Есть несколько способов упростить эти команды:

  1. Вам не нужно указывать полный путь к java.exe. Добавить Java в путь Windows («Пуск» -> «sysdm.cpl-> Вкладка« Дополнительно »->« Переменные среды »->« Выбрать путь »->« Изменить -> Добавить »; C: \ Program Files \ Java \ jdk1.6.0_18 \ bin \") , Или вы можете добавить JAVA_HOME и создать эту переменную среды.
  2. Вам не нужно вводить весь путь к классам (т. Е. Вы можете просто использовать -classpath "."). Введите каталог, в котором вы будете работать:

    cd "C: \ Users \ Scott \ workspace \ myproject \"

  3. Вы можете использовать пакет по умолчанию (поместите каталог файлов HelloWorld.java в свой рабочий каталог и не используйте директиву пакета Java)

Если вы сделаете эти изменения, вы запустите что-то вроде этого (и, возможно, сможете пропустить -classpath "."):

cd "C:\Users\Scott\workspace\myproject\"
javac -classpath "." HelloWorld.java
java -classpath "." HelloWorld
4 голосов
/ 11 ноября 2014

Вот что наконец сработало.

`@echo off
set path=%path%;C:\Program Files\Java\jdk1.7.0_71\bin;
set classpath=C:\Program Files\Java\jdk1.7.0_71\lib;
cd <packageDirectoryName>
javac .\trainingPackage\HelloWorld.java
cd ..
java trainingPackage.HelloWorld 
REM (Make sure you are on the parent directory of the PackageName and not inside the    Packagedirectory when executing java).`
3 голосов
/ 13 июня 2011

Javadoc самого NoClassDefFounError был бы хорошим началом ( здесь) , и тогда я предложу вам очистить и перестроить ваш проект.

1 голос
/ 13 июня 2011

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

set CLASSPATH=%CLASSPATH%;.
1 голос
/ 31 июля 2016

Java-файл:

package com.beans;

public class Flower{
 .......
}

packages :=> com.beans,
java class Name:=> Flower.java,
Folder structure (assuming):=> C:\com\beans\Flower.*(both .java/.class exist here)

тогда есть два способа его выполнить:

1. Goto top Folder (here its C:\>),
     then : C:> java com.beans.Flower 
2. Executing from innermost folder "beans" here (C:\com\beans:>),
     then: C:\com\beans:> java -cp ./../.. com.beans.Flower
1 голос
/ 04 апреля 2015

Испытывал ту же проблему вышеупомянутыми решениями, но ни одна не работала.Мне пришлось пройти через мой код Java только для того, чтобы обнаружить, что основная функция не может быть распознана, поскольку между ней не было пробела и (String), т.е. начальный код:

public static void main(String[]args){

рабочий код.

public static void main (String[]args){

Надеюсь, я кому-то помог.

...