Never Nop Tech

Never Nop Tech

分享軟體、旅遊、生活。

Javac編譯後執行時出現NoClassDefFoundError

錯誤內容:

Exception in thread “pool-1-thread-1″ java.lang.NoClassDefFoundError: org/json/JSONObject

at Server$RequestThread.run(Server.java:201)

…more,如圖1。

圖1 NoClassDefFoundError錯誤圖

問題解決方式:

編譯方式與執行方式錯誤,以下為在macOS或Linux系統下正確的Java編譯與執行步驟:

1.在 / 目錄下有 java-json.jar 、 Server.java 要將他們編譯再一起,因此執行:

javac -cp .:java-json.jar Server.java

2.執行剛剛用javac編譯完的類別檔

java -cp .:java-json.jar Server
請注意 『.:』 的存在,因為這樣才能抓到jar的路徑,個人因為這個問題查遍了很多文章,最後找到:https://fcamel-life.blogspot.tw/2010/01/javalangnoclassdeffounderror.html中的解決方式,成功編譯、執行,再也不會有抓不到jar檔的問題。

 (備份)

執行 Java 遇到這類問題表示 classpath 沒設好, 可能的幾個問題:
  • 沒有將 jar 檔加入 classpath, 記得用 -cp (或 -classpath) 指定位置, 預設為 -cp .
  • 若指定了 -cp, 記得要加 “.", 不然變成找不到原本目錄下的 class
  •  不同作業系統 -cp 裡用的分隔字元不同, 有些用 “;", 有些用 “:"
  • -cp 記得加在執行 class name 前面
假設目錄配置如下

bin/: 放編好的執行檔 (*.class)

src/: 原始碼 (*.java)

lib/: 放 jar 檔, 如 junit.jar

一個範例:

cd bin

java -cp .;../lib/junit.jar AllTests

以下是可能的錯誤範例

java -cp ../lib/junit.jar AllTests

java -cp .:../lib/junit.jar AllTests  # Windows 下用 ;

java AllTests -cp .;../lib/junit.jar