Устранение неполадок NoClassDefFoundError в Java - PullRequest
5 голосов
/ 21 марта 2011

У меня есть Java-программа Main.java, она находится в следующем каталоге:

/home/user/program/Main.java

Когда я пытаюсь запустить Main.java из каталога 'program', все идет хорошо, я использую эту строку:

/home/user/program$ java Main

Но когда я пытаюсь запустить Main.java из домашнего каталога:

/home$ java /home/user/program/Main

Я получаю:

Exception in thread "main" java.lang.NoClassDefFoundError: /home/user/program/Main
Caused by: java.lang.ClassNotFoundException: .home.user.program.Main

В чем причина этой ошибки?

Ответы [ 8 ]

10 голосов
/ 21 марта 2011

Это связано с вашим classpath, который по умолчанию будет текущим каталогом.Когда вы запускаете java Main из /home/user/program, он находит класс в текущем каталоге (поскольку пакет, по-видимому, не установлен, то есть по умолчанию).Следовательно, он находит класс в /home/user/program/Main.class.

Запуск java /home/user/program/Main из /home пытается найти класс в classpath (текущий каталог), который будет искать в /home/home/user/program, ожидая найти файлMain.class содержит определение класса Main с пакетом .home.user.program.

Дополнительные детали : я думаю, что Java-пусковая установка пытается быть красивой, конвертируя / -нотация для имени класса в.-нотации;и когда вы запускаете java /home/user/program/Main, он на самом деле запускает java .home.user.program.Main для вас.Это потому, что вы должны указывать не файл, а полностью указанное имя класса (т.е. включая спецификатор пакета).И когда у класса есть пакет, java ожидает найти этот класс в структуре каталогов, которая соответствует имени пакета, внутри каталога (или jar) в classpath;следовательно, он попытается найти в /home/home/user/program файл класса

. Вы можете исправить это, указав свой путь к классу с помощью -cp или -classpath:

java -cp /home/user/program Main
3 голосов
/ 21 марта 2011

Потому что он ищет класс, используя полное имя, которое вы даете (/ home / user / program / Main). Вы должны искать только класс Main, но используя хороший путь к классу: Java Main -cp / home / user / program

Это означает, что он будет искать основной класс в заданном наборе путей

0 голосов
/ 13 сентября 2013

Я столкнулся с той же ошибкой при попытке скомпилировать и запустить ее.Книга «Head First Java» объясняет и решает эту проблему соответствующим образом.Вот скриншот из книги для справки.

A screenshot from Head First Java about how to compile and run a java program by including package names.

Надеюсь, что это полезно.

0 голосов
/ 07 июля 2013

некоторое время назад столкнулся с такой ошибкой (NoClassDefFoundError).Я импортировал стороннюю библиотеку в свое приложение для Android, используя eclipse env.Я получил эту ошибку во время выполнения - не удалось найти какой-либо класс из этой сторонней библиотеки и был выдан результат этого NoClassDefFoundError, несмотря на то, что упомянутая библиотека правильно появилась в classpath, поэтому я действительно не знал, что еще можно сделатьДля решения этой проблемы.Играя с вкладкой «Заказ и экспорт» в «Путь сборки Java», я поместил импортированную стороннюю библиотеку в верхнюю часть списка всех библиотек в моем проекте.и проверил его флажок - это решило проблему

0 голосов
/ 21 марта 2011

Это работает для меня:

java -cp / home / user / program Main

0 голосов
/ 21 марта 2011

Проблема в том, что если вы вызываете java /home/user/program/Main, то пакет Main находится в значении home.user.program, что, как я полагаю, неверно для Main (я предполагаю, что оно находится в пакете по умолчанию, т.е.все).Есть ли объявление package в верхней части Main?

Я бы предложил использовать предложения пути к классам в других ответах.

0 голосов
/ 21 марта 2011

Из-за того, что вы говорите, я пришел к выводу:

  • Main находится в "верхнем" (корневом) пакете

И когда вы выполняете Java, вы должны указать classpathэто корневой каталог, в котором находится ваша структура pakage и классов.

В вашем случае это самая / home / user / program.И я думаю, что ваш classpath определен как "."(каталог, в котором вы находитесь).Когда вы вызываете java из дома, путь к классу берется ошибочно.

Если вы хотите вызывать свой основной, используя другой пакет, объявите пакет в верхней части класса:

package user.program;

Иустановите classpath в / home (или выполните Java из этого каталога).Затем вызовите java следующим образом:

java user.program.Main

, используя точки, потому что это полное имя класса (с указанием пакетов).Это переводится в каталог, объединяющий classpath + package + class.Например:

/home
user.program -> user/program/
Main         -> Main.class

Удачи!

0 голосов
/ 21 марта 2011

Ваша вторая версия команды не знает, где найти классы.Вам необходимо указать так называемый classpath

/home$ java -cp userprogram Main
...