Java.lang.NoClassDefFoundError java.lang.StringBuilder из кода с использованием java.lang.StringBuffer - PullRequest
1 голос
/ 21 июня 2010

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

Здесь идет.

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

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

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

  • пакет = gtechReconcile
  • classes = GtechReconciler.java, CSVFile.java, QueryMachine.java, FTPSender.java

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

  • ojdbc14.zip
  • edtftpj.jar

Я запускаю следующую строку в терминале в каталоге над пакетом исходного кода компиляции (т.е. / путь / к / классам, где / путь / к / классам / 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

Ответы [ 2 ]

2 голосов
/ 21 июня 2010

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


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

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

  1. Перейдите на /path/to/classes, добавьте в путь к классам текущий каталог (.) и выполните java, как вы делали ранее.
  2. Добавьте /path/to/classes к пути к классами беги java куда хочешь.
1 голос
/ 21 июня 2010

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

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

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

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