首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Java.lang.NoClassDefFoundError java.lang.StringBuilder从代码中提取java.lang.StringBuffer

使用Java.lang.NoClassDefFoundError java.lang.StringBuilder从代码中提取java.lang.StringBuffer
EN

Stack Overflow用户
提问于 2010-06-21 17:05:33
回答 2查看 5.7K关注 0票数 1

我知道有很多关于这个错误的问题,但是我发现找到一个和我的错误完全一样的错误并不容易。

开始吧。

我有一个非常小的应用程序,它将DB数据写入csv文件,然后将其上传到服务器。我让它在我的本地框上运行,这是非常棒的,但是最终版本需要在命令行的服务器框上作为cron作业运行。

我正在处理主java类的命令行调用,这给我带来了很多麻烦。

我的依赖结构是这样的:我的类

  • package=gtechReconcile
  • classes= GtechReconciler.java,CSVFile.java,QueryMachine.java,FTPSender.java

我的外唇

  • ojdbc14.zip
  • edtftpj.jar

在编译源代码包(即/ path /to/ class /path/to/class/具有所有已编译的类文件)上面的目录中,我在终端中运行以下行--这个路径是命令行运行时的当前目录:

代码语言:javascript
复制
java -cp /<snip>/lib/ojdbc14.zip:/<snip>/lib/edtftpj.jar:/path/to/classes gtechReconcile.GtechReconciler

这个错误告诉我它找不到java.lang.StringBuilder,尽管这在我的代码中不存在。我使用的是StringBuffer,显然StringBuilder从Java5开始就取代了它。也许java编译器将其转换为StringBuilder,而jvm却没有解决这个问题?

我在这里错过了什么?

编辑:从提示符中添加错误(澄清了在哪里执行,以及包文件夹中存在什么):

代码语言:javascript
复制
[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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-06-21 17:17:20

当您在您的StringBuilder类中创建新的CSVFile时,会引发此异常。Google告诉我这是GCJ经常遇到的问题,使用一个官方的Sun。它有效地解决了这种问题。

假定gtechReconcile文件夹包含gtechReconcile包中的所有类文件。

例如,如果您有/path/to/classes/gtechReconcile/GtechReconciler.class,则有两个选项。

  1. 转到/path/to/classes,将当前目录(.)添加到类路径,并像以前一样运行java
  2. /path/to/classes添加到类路径中,并在任何地方运行javaH 212G 213
票数 2
EN

Stack Overflow用户

发布于 2010-06-21 17:15:34

默认的类路径(如果没有指定)是当前目录(".")。

但是,如果指定类路径,则java将使用该路径而不是默认路径,从而删除当前目录。

解决问题的方法很简单:将“当前目录”添加到类路径中,例如:

代码语言:javascript
复制
java -cp .:/<snip>/lib/ojdbc14.zip:/<snip>/lib/edtftpj.jar:/<snip>/bin/ gtechReconcile.GtechReconciler
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3086750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档