1

我知道有很多關於這個錯誤的問題,但我還沒有發現很容易找到一個完全像我的。Java.lang.NoClassDefFoundError java.lang.StringBuilder從使用java.lang.StringBuffer的代碼

在這裏。

我有一個非常小的應用程序,它將DB數據寫入一個csv文件,然後將其上傳到服務器。我把它放在eclipse的本地盒子上運行,這非常棒,但最終版本需要從命令行作爲服務器盒子上的cron作業運行。

我正在爲主要的java類的命令行調用,它給了我很多麻煩。

我的依存結構是這樣: 我類

  • 包= gtechReconcile
  • 類= GtechReconciler.java,CSVFile.java,QueryMachine.java,FTPSender.java

我external libs

  • 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 
+0

我假設你在某種Unix的風格? – 2010-06-21 17:11:53

+0

是的,我很確定服務器是RedHat,但不是100%。 – Rich 2010-06-21 17:14:23

回答

2

當你在你CSVFile類中創建一個新的StringBuilder的異常。谷歌告訴我,這是GCJ的常見問題,使用官方的Sun JVM。它通常解決這種問題。


gtechReconcile文件夾被假定爲包含在gtechReconcile包中的所有類文件。

例如,如果您有/path/to/classes/gtechReconcile/GtechReconciler.class,則有兩個選項。

  1. 轉到/path/to/classes,添加到classpath當前目錄(.)和運行java像之前。
  2. /path/to/classes添加到類路徑並運行java無論你喜歡。
+0

正確,我想我還不夠清楚,但/ /bin是==/path/to/classes,並且在類路徑中。我嘗試過。在理智的類路徑中。編輯我的帖子使用/路徑/到/類似於目錄更清晰的表示 – Rich 2010-06-21 17:21:30

+0

沒關係。我確實需要使用QueryMachine類的ojdbc連接到我們的數據庫,但我非常有信心這個zip文件沒問題,但是因爲我已經在我們運行的其他一些應用程序中使用了它。 – Rich 2010-06-21 17:51:14

+0

謝謝frm,很好找。我忽略了StringBuilder,因爲我的代碼沒有明確地調用它。它必須位於Java文件或IO類之一中。事實證明,鏈接到服務器上別名java命令的JVM是從2002年開始的。使用java6執行命令,現在一切正常。 – Rich 2010-06-21 18:11:10

1

默認的類路徑(如果你不指定一個)是當前目錄( 「」)。

但是,如果您指定了一個類路徑,java將使用它來代替默認值,從而刪除當前目錄。

的解決問題的方法很簡單:添加「當前目錄」到類路徑,如:

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

。 =//bin並添加它沒有改善的情況 – Rich 2010-06-21 17:20:02

相關問題