新手在 CMD 下 javac/java 最常遇到的 NoClassDefFoundError,**90% 由包名與運行目錄不匹配引起**。本文用一個帶包結構的 HelloWorld 為例,演示正確的編譯、運行目錄與命令參數。
E:\Work\MyJava\SocketDemo\src\cn\wgh\socket\HelloWorld.java
package cn.wgh.socket;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
E:\Work\MyJava\SocketDemo\src\cn\wgh\socket> java HelloWorld 錯誤: 找不到或無法加載主類 HelloWorld
原因:類的全限定名是 cn.wgh.socket.HelloWorld,JVM 會從 **classpath 根目錄** 按包路徑查找 cn/wgh/socket/HelloWorld.class。
E:\Work\MyJava\SocketDemo\src> javac -d ../classes cn/wgh/socket/HelloWorld.java
E:\Work\MyJava\SocketDemo\classes> java cn.wgh.socket.HelloWorld Hello world!
| 操作 | 當前目錄 | 命令關鍵點 |
|---|---|---|
| 編譯 | 源碼根目錄(含包結構) | javac -d 輸出目錄 包路徑/類名.java |
| 運行 | 字節碼根目錄(輸出目錄) | java 全限定類名 |
java -cp .;lib/* 全限定類名(Windows 用分號,Linux 用冒號);