如何運行JAVA和CLASSPATH環(huán)境變量的設置是學習和使用JAVA中最基本的問題,本不應在此贅述。但近來不少人在論壇上提出的問題卻與此有關,我平時碰到的一些初學者也往往在這個問題上卡了殼,因此寫了這篇小東西,希望能對一些初學者有用。
我們都知道要運行一個JAVA程序要經歷編寫原程序,編譯和運行三個步驟。其中編譯要用到javac命令,而運行則要用到java命令。比如有一個HelloWorld的類,保存在HelloWorld.java文件中。編譯時用:
javac HelloWorld.java
生成HelloWorld.class文件,運行時要用:
java HelloWorld
這里要注意javac與java兩個命令的重要差別。javac需要的參數(shù)是JAVA原文件的文件名,因此.java的后綴是不能少的,而javac需要的參數(shù)是JAVA的類名,所以絕對不能加.class后綴。這樣以下兩種用法都是錯誤的:
javac HelloWorld (Wrong!!)
java HelloWorld.class (Wrong!!)
又因為Windows的文件系統(tǒng)對文件名的大小寫是不敏感的,因此在編譯時給出的原文件名大小寫沒有關系,但java命令要的是類名,而在JAVA中所有的標識符包括類名都是大小寫敏感的,因此在用java命令時,類名的大小寫必須和原文件中定義的類名完全一致。注意下列命令用法:
javac helloworld.java (Corrent!!)
java HelloWorld (Wrong!!)
既然用java命令運行JAVA程序時給出的是類名而不是文件名,那么java又是到那里去找到要運行的類的呢?這就要用到CLASSPATH了。即可以通過設置CLASSPATH環(huán)境變量,又可以通過-cp命令行參數(shù)指示java到哪里去查找類。其實javac也是需要CLASSPATH來指明編譯時到哪里查找用到的類的定義的。如果CLASSPATH設定不正確,運行時就會碰到這樣的錯誤:
Exception in thread "main" java.lang.NoClassDefFoundError: <類名>
而遇到這樣的錯誤原因只可能是兩個:
1. CLASSPATH設定不正確;
2. 類名打錯。初學者最常見的是大小寫錯。
CLASSPATH是一組互相間由";"隔開的目錄,zip文件或jar文件。ZIP和JAR文件一般是用來引入一些第三方的類庫,這些文件中也都包含了JAVA的類。這些目錄、ZIP文件或JAR文件一般都是用絕對路徑,如果用相對路徑,那么在運行時就會解釋為相對于當前路徑。
在Win9x系統(tǒng)中,一般可以通過在autoexec.bat中加入這樣的語句來定義全局的CLASSPATH(假設你把自己寫的類放在c:\myjava目錄下)
set CLASSPATH=c:\myjava
Win9x操作系統(tǒng)需要重起機器,這個設置才能起作用。
如果是Windows2000,可以在控制面板\系統(tǒng)\高級\環(huán)境變量中新建CLASSPATH環(huán)境變量。Windows2000不需要重起機器,但對設置之前打開的DOS命令窗口沒有效果。
要檢查CLASSPATH設置是否正確,可以通過在DOS提示符下大打入以下命令:
echo %CLASSPATH%
如果要用-cp命令參數(shù),則可以這樣:
java -cp c:\myjava .....
下面是天涯浪子與12237558鯤鵬的一段對話,希望能對初學者有點幫助~
(2001-06-08 17:01:06) 天涯浪子
C:\jdk
這是我JDK的安裝目錄!
你幫我寫一個autoexec.bat 和Config.sys好嗎?
鯤鵬:
與config.sys無關.
關鍵是你的類放在什么路徑.
天涯浪子:我寫的在c:\java下面!
鯤鵬:
autoexec.bat:
set PATH=%PATH%;c:\jdk\bin
set CLASSPATH=c:\java
天涯浪子:那原來的PATH還用改嗎?
鯤鵬:原來的PATH是怎樣的?
天涯浪子:哦,我加在原來";"的后面了~
鯤鵬:這樣應該也不錯呀。
天涯浪子:還是出錯了~
鯤鵬:你把提示發(fā)過來
天涯浪子:
C:\java>java helloworldapp
Exception in thread "main" java.lang.NoClassDefFoundError: helloworldapp (wrong
name: HelloWorldApp)
at java.lang.ClassLoader.defineClass0(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown So
這只是一半,還有一半沒有發(fā)過來呢~
鯤鵬:
執(zhí)行javac helloworld.java時,javac將通過文件系統(tǒng)查找helloworld.java這個文件,因為文件系統(tǒng)是大小寫不分的,所以helloworld.java 和HelloWorld.java是一樣的。
執(zhí)行java helloworld時,java自己查找helloworld這個類,即使它通過文件系統(tǒng)找到了HelloWorld.class這個類文件,但它會把類文件中的類名和你給出的類名比較,這個比較是區(qū)分大小寫的。
我沒有說錯。
在執(zhí)行javac時,給出的文件名大小寫是沒有關系的,
但執(zhí)行java時,給出的類名大小寫也必須正確。