簡體   English   中英

成功編譯但得到NoClassDefFound錯誤

[英]successful compile but getting NoClassDefFound error

我是一名制葯科學專業的學生,​​在我去的時候正在學習編碼,所以如果這個問題的答案逃脫了我,我會道歉。

我在NetBeans和Eclipse中編寫了一些java源代碼。 代碼在兩個IDE中運行良好,但是當我將所有.java文件移動到UNIX環境時,我成功編譯了代碼,但是命令行告訴我它找不到位於同一個jar中的類。我編譯了。 我收到了有關編譯的警告,但我認為這不會影響代碼的運行。 我搜索和搜索,似乎無法找到答案。 這是我的命令行代碼(有我的程序名稱等):

[jknights@u2:~]$ cd chorus_jk

[jknights@u2:~/chorus_jk]$ ls
Chorus_JK.java       EntropyNormal_JK.java   Main_JK.java
colt.jar             EstimateParzen_JK.java  RA_reformatted_forCHORUS_JK.txt
Combination_JK.java  LIST_JK.java

[jknights@u2:~/chorus_jk]$ javac -cp colt.jar ./*.java -Xlint:unchecked
.
.  (I edited out the 100 warnings as they refer to unchecked items)
.

100 warnings

[jknights@u2:~/chorus_jk]$ jar cfe ChorusJK_RA.jar Main_JK ./*.class

[jknights@u2:~/chorus_jk]$ java -jar ChorusJK_RA.jar
89
317504
Exception in thread "main" java.lang.NoClassDefFoundError: cern/colt/matrix/DoubleMatrix2D
    at Chorus_JK.init(Chorus_JK.java:24)
    at Main_JK.main(Main_JK.java:23)
Caused by: java.lang.ClassNotFoundException: cern.colt.matrix.DoubleMatrix2D
    at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
    ... 2 more

“89”和“317504”是讀入的文件的摘要輸出,因此看起來編譯成功; 但是,當程序到達計算部分時,它在線程“main”中給出了異常java.lang.NoClassDefFoundError:cern / colt / matrix / DoubleMatrix2D錯誤。 非常感謝您的幫助!

因為DoubleMatrix2D可能在那個jar中,所以你需要在運行應用程序時將colt.jar添加到classpath。 嘗試

 java -cp colt.jar -jar ChorusJK_RA.jar

它在IDE中工作,因為它們默認將jar添加到類路徑。

colt.jar包中的“cern.colt.matrix.DoubleMatrix2D”類是什么? 也許您應該將它添加到第二個調用的類路徑中:

java -cp colt.jar -jar ChorusJK_RA.jar

從命令行運行代碼的難度證明了IDE的價值。 如果我正確理解您的工作流程,您在一台帶有IDE的計算機上開發了代碼,那么您必須在沒有GUI環境的情況下在另一台計算機上運行它,因此您無法使用命令行。 這很常見,特別是對於Web應用程序開發。

Netbeans創建一個dist文件夾(發布),您可以配置項目將庫復制到lib文件夾(我認為這是默認行為)。 jar文件中包含的清單文件應包含如下所示的行:Class-Path:lib / colt.jar

您可以使用zip工具或在IDE中檢查jar文件的內容。 在文件視圖的netbeans中,您可以展開dist文件夾,然后展開jar以檢查其內容。

在將代碼從圖形環境移動到命令行之前,請嘗試在沒有IDE的情況下運行程序。 您應該能夠雙擊/ dist文件夾中的jar文件,它應該運行。 如果是,那么您應該能夠將整個/ dist文件夾移動到具有不同操作系統的其他計算機,並且它仍然應該運行而無需將-cp colt.jar添加到命令行參數。

您不需要重新編譯代碼以使其在不同的操作系統上運行。 只需移動/ dist文件夾即可體驗“一次編寫,隨處運行”的樂趣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM