執行 Run 類別時拋出 NoClassDefFoundError: org/apache/wsif/WSIFException,雖然 JAR 檔存在,但 JVM 找不到。根因:Classpath 使用相對路徑,導致執行工作目錄不同時路徑失效。
localJava.client.dynamic.Runwsif.jar (位於 C:\wsif\lib)C:\wsif\build\samples\localjava\client\dynamic\Run.classjava localjava.client.dynamic.Run samples/localjava/AddressBook.wsdl (於 C:\wsif\build\samples 下執行)Classpath 設定為相對路徑 lib\wsif.jar。JVM 依據當前工作目錄解析相對路徑。若工作目錄非預期位置,JAR 即找不到。
環境變數 CLASSPATH 直接寫完整路徑:
CLASSPATH=.;C:\wsif\lib\wsif.jar;C:\wsif\lib\other.jar;...
優點:不受工作目錄影響,穩定可靠。
-cp 參數指定運行時 classpathcd C:\wsif
java -cp %CLASSPATH%;build\samples localjava.client.dynamic.Run samples/localjava/AddressBook.wsdl
build\samples:指定 Run.class 所在包的根目錄 (即 localjava 的上層).\build\samples 或 ..\wsif\build\samplescd C:\wsif\build\samples
java -cp "C:\wsif\lib\wsif.jar;C:\wsif\lib\other.jar;." localjava.client.dynamic.Run samples/localjava/AddressBook.wsdl
缺點:指令冗長,不易維護。
建立 run.bat 封裝完整 java 指令:
@echo off
set CP=C:\wsif\lib\wsif.jar;C:\wsif\lib\cstools.jar;C:\wsif\build\samples
java -cp %CP% localjava.client.dynamic.Run samples/localjava/AddressBook.wsdl
優點:版本可控、易分享、避免環境變數汙染。
-cp 或批次檔,勿依賴系統環境變數package 與目錄結構對應:java -cp 根目錄 完整類別名. 代表當前目錄,.. 代表父目錄Classpath 問題看似瑣碎,實則是 Java 部署最常見痛點。建立標準化啟動腳本,可消除 90% 的類別找不到錯誤。