Java.lang.NoClassDefFoundError java.lang.StringBuilder из кода с использованием java.lang.StringBuffer

StackOverflow https://stackoverflow.com/questions/3086750

Вопрос

Я знаю, что есть много вопросов относительно этой ошибки, но мне было нелегко найти такой же, как у меня.

Вот оно.

У меня есть довольно небольшое приложение, которое записывает данные БД в файл csv, а затем загружает их на сервер.У меня он работает на моем локальном компьютере вне eclipse, и это здорово, но окончательную версию нужно запускать как задание cron на сервере из командной строки.

Я работаю над вызовом командной строки для основного класса Java, и это доставляет мне много проблем.

Моя структура зависимостей такова:Мои занятия

  • пакет = gtechReconcile
  • классы = GtechReconciler.java, CSVFile.java, QueryMachine.java, FTPSender.java

Мои внешние библиотеки

  • ojdbc14.zip
  • edtftpj.jar

Я запускаю следующую строку в терминале в каталоге над компилируемым исходным пакетом (т. е. /path/to/classes, где /path/to/classes/gtechReconcile/ содержит все файлы скомпилированных классов). Этот путь является текущим каталогом, когда команда выполняется строка:

java -cp /<snip>/lib/ojdbc14.zip:/<snip>/lib/edtftpj.jar:/path/to/classes gtechReconcile.GtechReconciler

Затем ошибка сообщает мне, что не удается найти java.lang.StringBuilder, хотя его не существует в моем коде.Я использую StringBuffer, который, очевидно, заменил StringBuilder начиная с Java5.Возможно, компилятор Java преобразовал это в StringBuilder, который jvm затем не разрешил?

Что мне здесь не хватает?

РЕДАКТИРОВАТЬ :добавлена ​​ошибка из подсказки (уточнено откуда это выполняется и что присутствует в папке пакета):

[gtechReconcile]$ pwd
/path/to/
[gtechReconcile]$ cd classes/gtechReconcile/
[gtechReconcile]$ ls
CSVFile.class  FTPSender.class  GtechReconciler.class  QueryMachine.class  reports
[gtechReconcile]$ cd ..
[classes]$ ls
gtechReconcile
[classes]$ java -cp .:/path/to/lib/ojdbc14.zip:/path/to/lib/edtftpj.jar gtechReconcile.GtechReconciler
Creating file
Exception in thread "main" java.lang.NoClassDefFoundError: while resolving class: gtechReconcile.CSVFile
at java.lang.VMClassLoader.resolveClass(java.lang.Class) (/usr/lib/libgcj.so.5.0.0)
at java.lang.Class.initializeClass() (/usr/lib/libgcj.so.5.0.0)
at gtechReconcile.GtechReconciler.main(java.lang.String[]) (Unknown Source)
Caused by: java.lang.ClassNotFoundException: java.lang.StringBuilder not found in [file:./, file:/opt/mms_tstt2/gtechReconcile/lib/ojdbc14.zip, file:/opt/mms_tstt2/gtechReconcile/lib/edtftpj.jar, file:/usr/share/java/libgcj-3.4.6.jar, file:./, core:/]
at java.net.URLClassLoader.findClass(java.lang.String) (/usr/lib/libgcj.so.5.0.0)
at gnu.gcj.runtime.VMClassLoader.findClass(java.lang.String) (/usr/lib/libgcj.so.5.0.0)
at java.lang.ClassLoader.loadClass(java.lang.String, boolean) (/usr/lib/libgcj.so.5.0.0)
at _Jv_FindClass(_Jv_Utf8Const, java.lang.ClassLoader) (/usr/lib/libgcj.so.5.0.0)
at java.lang.Class.forName(java.lang.String, boolean, java.lang.ClassLoader) (/usr/lib/libgcj.so.5.0.0)
at _Jv_BytecodeVerifier.verify_instructions_0() (/usr/lib/libgcj.so.5.0.0)
at _Jv_VerifyMethod(_Jv_InterpMethod) (/usr/lib/libgcj.so.5.0.0)
at _Jv_PrepareClass(java.lang.Class) (/usr/lib/libgcj.so.5.0.0)
at _Jv_WaitForState(java.lang.Class, int) (/usr/lib/libgcj.so.5.0.0)
at java.lang.VMClassLoader.linkClass0(java.lang.Class) (/usr/lib/libgcj.so.5.0.0)
at java.lang.VMClassLoader.resolveClass(java.lang.Class) (/usr/lib/libgcj.so.5.0.0)
...2 more
Это было полезно?

Решение

Исключение возникает при создании нового StringBuilder в классе CSVFile.Google сообщает мне, что это частая проблема с GCJ, используйте официальную JVM Sun.Обычно это решает подобные проблемы.


А gtechReconcile Предполагается, что папка содержит все файлы классов в gtechReconcile упаковка.

Например, если у вас есть /path/to/classes/gtechReconcile/GtechReconciler.class, у вас есть два варианта.

  1. Идти к /path/to/classes, добавьте в путь к классам текущий каталог (.) и беги java как вы это делали раньше.
  2. Добавлять /path/to/classes к пути к классам и запустите java где угодно.

Другие советы

Путь к классам по умолчанию (если вы его не указали) — это текущий каталог («.»).

Однако, если вы укажете путь к классам, Java будет использовать его вместо значения по умолчанию, удалив тем самым текущий каталог.

Решение вашей проблемы простое:добавьте «текущий каталог» в путь к вашему классу, например:

java -cp .:/<snip>/lib/ojdbc14.zip:/<snip>/lib/edtftpj.jar:/<snip>/bin/ gtechReconcile.GtechReconciler
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top