代码之家  ›  专栏  ›  技术社区  ›  Rich khmarbaise

使用java.lang.StringBuffer的代码中的java.lang.NoClassDeffoundError java.lang.StringBuilder

  •  1
  • Rich khmarbaise  · 技术社区  · 16 年前

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

    来吧。

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

    我正在为主Java类进行命令行调用,这给了我很多麻烦。

    我的依赖关系结构如下: 我的班级

    • package=gtechreconcile
    • classes=gtechronizer.java、csvfile.java、querymachine.java、ftpsender.java

    我的外部libs

    • OJDBC14ZIP
    • 电瓶

    我在编译源程序包上方目录的终端中运行以下行(即/path/to/classes,其中/path/to/classes/gtechcleancile/包含所有编译的类文件)。运行命令行时,此路径是当前目录:

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

    然后,错误告诉我它找不到java.lang.StringBuilder,即使我的代码中不存在它。我使用了一个StringBuffer,这显然是自Java5以来StringBuilder所取代的。也许Java编译器将此转换为StrugBuudor,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 回复  |  直到 16 年前
        1
  •  2
  •   frm    16 年前

    在CSVFile类中创建新的StringBuilder时引发异常。谷歌告诉我这是GCJ的一个常见问题,使用官方的Sun JVM。它通常解决这种问题。


    这个 gtechReconcile 假定文件夹包含 通用技术公司 包裹。

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

    1. /path/to/classes ,将当前目录添加到类路径( . 然后运行 java 就像你以前那样。
    2. 添加 /路径/目标/类 to the classpath and run 爪哇 你想去哪儿都行。
        2
  •  1
  •   desau    16 年前

    默认的类路径(如果不指定)是当前目录(“.”)。

    但是,如果指定了类路径,Java将使用它代替默认,从而移除当前目录。

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

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