Страшный java.lang.NoClassDefFoundError - PullRequest
4 голосов
/ 09 ноября 2009

Я просмотрел многие существующие темы об этой ошибке, но все же не повезло. Я даже не пытаюсь упаковать банку или использовать какие-либо сторонние инструменты для упаковки. Я просто запускаю изнутри Eclipse (прекрасно работает), а затем пытаюсь запустить точно такое же приложение из командной строки, в том же месте, в котором оно создано (получая эту ошибку). Моя цель заключается в том, чтобы иметь возможность заархивировать папку bin и отправить ее для запуска кому-то еще через скрипт командной строки. Некоторые детали:

  • Это приложение командной строки, и я использую commons-lang-2.4.jar для строковых утилит. Это файл, который не может быть найден (в частности, «java.lang.NoClassDefFoundError: org / apache / commons / lang / StringEscapeUtils»)
  • У меня есть этот jar в папке lib, и я добавил его в путь сборки в Eclipse, щелкнув правой кнопкой мыши «Build Path -> Add to Build Path»
  • Файл .classpath выглядит правильно и содержит ссылку на jar, но я предполагаю, что файл используется только Eclipse (содержит эту строку: <classpathentry kind="lib" path="lib/commons-lang-2.4.jar"/>)
  • Может ли это быть связано с настройкой рабочего каталога Eclipse? У меня есть некоторые внутренние файлы шаблонов, которые я создал, которые находятся в каталоге src / templates, и единственный способ, которым я могу их увидеть, - это установить рабочий каталог проекта в AppName / src. Может быть, я должен положить их куда-нибудь еще?

Дайте мне знать, поможет ли дополнительная информация. Конечно, это что-то простое, но я потратил слишком много времени на этом этапе. Это напоминает мне, почему я изначально оставил Java в '05 или около того ...

Ответы [ 7 ]

13 голосов
/ 09 ноября 2009

A NoClassDefFoundError в основном означает, что класс находился в пути к классам во время компиляции, но отсутствует в пути к классам во время выполнения.

В вашем случае при выполнении с помощью java.exe из командной строки вам необходимо указать classpath в аргументе -cp или -classpath. Или, если это файл JAR, вам нужно указать его в записи class-path его файла MANIFEST.MF.

Значением аргумента / записи может быть либо абсолютный, либо относительный путь файловой системы к папке, содержащей все файлы .class, или к отдельному файлу .jar. Вы можете разделять пути, используя точку с запятой ;. Если путь содержит пробелы, вам нужно заключить в него конкретный путь двойными кавычками ". Пример:

java -cp .;c:/path/to/file.jar;"c:/spacy path/to/classes" mypackage.MyClass

Чтобы сэкономить время на ввод и редактирование аргумента в командной строке каждый раз, используйте файл .bat.

Редактировать : Я должен был понять, что вы используете операционную систему на основе Unix. Приведенные выше примеры ориентированы на Windows. В случае Unix-подобных платформ вы можете следовать тем же правилам, но вам нужно разделять пути, используя двоеточие :, и вместо конечного пакетного файла используйте файл .sh.

java -cp .:/path/to/file.jar:"/spacy path/to/classes" mypackage.MyClass
6 голосов
/ 09 ноября 2009

Вы указываете classpath для java в командной строке?

$ java -cp lib/commons-lang-2.4.jar your.main.Class
2 голосов
/ 09 ноября 2009

Параметр classpath, который вы устанавливаете в Eclispe, предназначен только для IDE и не влияет на работу вашего приложения вне IDE. Даже если вы используете функцию Eclipse для экспорта своего приложения в качестве исполняемого файла JAR, не существует готового способа упаковки всех файлов JAR, от которых зависит ваше приложение.

Если вы упаковали ваше приложение в файл jar с именем myapp.jar, то при запуске команды, подобной приведенной ниже, запустится приложение с файлом, от которого вы зависите, если у вас их несколько, просто добавьте их в Windows * * или : в Unix:

java -jar myapp.jar -cp .;c:/pathtolibs/commons-lang-2.4.jar

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

1 голос
/ 09 ноября 2009

Рассмотрим File -> Export -> Runnable jar для создания файла jar, который может быть вызван напрямую с помощью

java -jar yourProgram.jar

Есть несколько вариантов в зависимости от ваших потребностей.

0 голосов
/ 11 марта 2014

убедитесь, что ваша банка commons-lang-2.4.jar в classpath, а не в избыточности.

Я всегда добавляю файл jar в мой путь к классу, и в моем классе есть 2 файла jar. После того, как я его удаляю, работай плавно

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

Eclipse по умолчанию не создает исполняемые классы Java. Не спрашивайте меня, почему, но это, вероятно, связано с использованием их собственного tools.jar (где-то в plugins / org.eclipse.core?), Чтобы Eclipse мог работать без JDK.

Обычно вы можете перейти в каталог bin вашего проекта и сделать:

java -cp . MyClass

Но если у вас есть внешние банки, Eclipse обрабатывает их внутренним образом другим странным способом, так что вам нужно будет добавить и их.

0 голосов
/ 09 ноября 2009

Eclipse не перемещает никакие jar-файлы из вашего classpath в папку bin вашего проекта. Вам нужно скопировать утилитарный файл в папку bin. Если вы переместите его в корень папки bin, вы сможете обойтись без записей пути к классам, но это не рекомендуемое решение. Посмотрите @ 1001 * ответ @ BalusC для хорошего освещения этого.

...