Java.lang.NoClassDefFoundError java.lang.StringBuilder из кода с использованием java.lang.StringBuffer
-
28-09-2019 - |
Вопрос
Я знаю, что есть много вопросов относительно этой ошибки, но мне было нелегко найти такой же, как у меня.
Вот оно.
У меня есть довольно небольшое приложение, которое записывает данные БД в файл 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
, у вас есть два варианта.
- Идти к
/path/to/classes
, добавьте в путь к классам текущий каталог (.
) и бегиjava
как вы это делали раньше. - Добавлять
/path/to/classes
к пути к классам и запуститеjava
где угодно.
Другие советы
Путь к классам по умолчанию (если вы его не указали) — это текущий каталог («.»).
Однако, если вы укажете путь к классам, Java будет использовать его вместо значения по умолчанию, удалив тем самым текущий каталог.
Решение вашей проблемы простое:добавьте «текущий каталог» в путь к вашему классу, например:
java -cp .:/<snip>/lib/ojdbc14.zip:/<snip>/lib/edtftpj.jar:/<snip>/bin/ gtechReconcile.GtechReconciler