如何在win9x下配置JDK
<HelloWorld>@by [email protected] 2002-6-5 ver 0.5
公開發表在http://www.java.com.cn/
適用於win9x平台下,j2sdk se1.3以上,對j2sdk se1.2.x有一定參考意義!
1總述
1.1什麼是JDK
JDK是Java develop kit的縮寫,它是早期Java的開發包名稱,一直延用至今!
在1998年jdk發表1.2版的時候,Sun公司使用了新名稱Java 2 platform來稱呼Java
譯成中文就是“Java平台”,修改後的jdk稱為J2sdk即Java 2 (platform) software
Develping kit,並分為標准版(Standard Edition)又稱j2se, 企業版(Enterprise Edition)
又稱j2ee,微型版(MicorEdition)又稱j2me.它們有不同的用途,不過最基本的開發包還是j2se.
1.2JDK的最新版
JDK的最新版可以在java.sun.com下載,到2002-6-5為止,j2se發布到1.4.0。在win32(win9x或
winNT/2000/xp)下有英文版和國際版(International),國際版的工具有中文提示!
JDK的下載地址是
1.4版 http://java.sun.com/j2se/1.4/download.html
1.3版 http://java.sun.com/j2se/1.3/download.html
不推薦使用1.2以前的版本,除非你有特別的要求!
本文檔的示例中使用j2se 1.4 English版
1.3安裝j2sdk
從sun下載的jdk是一個可執行文件,約30多兆,直接執行即可。注意它要求一個安裝目錄,
默認下是jdk1.x.x,這個目錄是可修改的!為了方便下面的描述,這裡假設安裝在D:/j2sdk/se14
目錄下。最後jdk會自動安裝一個java 運行時環境(java runtime enveronment)在c:/Program files/
javasoft/...不要和上面的jdk目錄搞混了!
2.jdk詳解
2.1jdk的虛擬機
jdk分為二個部分,一是上面提到的java 運行時環境,二是開發環境。它們各有一套
Java虛擬機,在分別屬於Java運行時環境和開發環境的目錄下各有一個jre目錄,這就是真正的Java
虛擬機所在!
Java運行時環境的虛擬機在:
c:/Program files/javasoft/.../jre
1.4版可能為:C:\Program Files\Java\j2re1.4.0
Java開發環境的虛擬機在:
D:/j2sdk/se14/jre
在整個windows環境中有很多Java.exe可執行文件,最終它們都是調用以上二者之一的虛擬機!
選擇虛擬機可以使用控制面板上的Java Plug-in,高級選項卡中Java Rutime Environment選單
使用缺省值時使用Java運行時環境的虛擬機。
這同一個jdk安裝的這兩個虛擬機基本上沒有區別!
2.2可執行文件java.exe和javac.exe的選擇
這兩個工具分別用於執行Java程序和編譯Java程序!在裝有Jdk的機器上有多個java和javac文件!
我們可以通過設置環境變量Path來選擇使用某一個Java.exe或javac.exe文件!
多個版本的java.exe和javac.exe不能通用,也不能修改位置!也就是說當把windows目錄下的java.exe
移動到JDK的安裝目錄下,它可能將不能執行(早期的java.exe是這樣,在1.3以後好像沒有這種說法,大家
可以試一試,1.3以後好像是通過注冊表取得虛擬機的位置,而不是相對路徑!)。
推薦使用c:/j2sdk/se14/bin目錄下的Java.exe,這是一種習慣,沒有必要的理由!
這時path可以設置為path=c:/j2sdk/se14/bin;%path%,注意在windows目錄下也有一個java.exe!!
也就是說即使不設置path也可以執行Java程序!
在path變量中,越靠前的目錄中的可執行文件將有越高優先執行權!也就說在目錄a和目錄b中均有文件
c.exe時,如果path中a在b前,將執行a目錄下的c.exe而不是b/c.exe
2.3類路徑classpath
這是一個古老的問題,在1.2以後不再需要classpath來設置系統類的路徑!classpath是為了設置
用戶編寫的類或第三方類庫而設置的!
比如用戶將編譯好的類放在X:\pathto\classes目錄下,classes目錄下是包目錄如com/some/...
也可能直接是類文件HelloWorld.class
執行時這樣使用,當前目錄為任意!
>java -cp X:\pathto\classes HelloWorld
-cp 後跟的就是classpath,設置環境變量CLASSPATH的效果是一樣的!
也可以在classpath中使用壓縮文件,比如zip或jar.如果用戶把HelloWorld.class放入了
Some.jar文件中!
>java -cp X:\pathto\Some.jar HelloWorld
當混合使用多個目錄或jar文件時,Java虛擬機執行第一個找到的類!
>java -cp X:\pathto\classes;X:\pathto\Some.jar HelloWorld
將不執行Some.jar中的HelloWorld.class
2.4編譯Helloworld.java
2.4.1編譯無包(公共包)的Java程序
Helloworld.java的內容如下:
//這裡暫不使用包!
// package nyra.pljc.helloworld.win9x;
public class HelloWorld{
public static void main(String[] argv){
System.out.println("Hello,world!");
}
}
注意Java是區分大小寫的,請注意大小寫錯誤!
HelloWorld保存在X:\mywork\HelloWorld.java中,注意文件名,申明為public的類只能保存在
同名文件中(大小寫一致)!
編譯,當前目錄為任意!
>javac -sourcepath x:\mywork HelloWorld.java
注意sourcepath為源文件目錄!需要引用其它類(.class)時候應使用classpath(不能簡寫為cp)如下:
>javac -sourcepath x:\mywork -classpath X:\otherclass HelloWorld.java
2.4.2編譯有包的Java程序
Helloworld.java的內容如下:
//注意,申明了包!!
package nyra.pljc.helloworld.win9x;
public class HelloWorld{
public static void main(String[] argv){
System.out.println("Hello,world!");
}
}
注意Java是區分大小寫的,請注意大小寫錯誤!
HelloWorld保存在X:\mywork\HelloWorld.java中,注意文件名,申明為public的類只能保存在
同名文件中(大小寫一致)!源文件不一定要保存在包目錄(nyra/pljc/helloworld/win9x)下!
編譯,當前目錄為任意!
>javac -sourcepath x:\mywork -d . HelloWorld.java
注意-d .指得是在當前目錄下生成包目錄和類文件,如果不指定-d則在當前目錄下生成HelloWorld
.class,這裡執行java HelloWorld會提示沒有這個類,原因是沒有包目錄,所以一定要使用-d
要在原文件目錄(x:\mywork)下生成類文件,則使用-d x:\mywork
2.4.3編譯文件查找順序
當需要類StrangeClass,Java將查找StrangeClass.class文件
Java程序先檢查bootstrap核心類目錄,如果沒有目標
檢查Extension類目錄,及其目錄的jar文件中(這個目錄在虛擬機目錄jre/lib/ext),如果沒有
檢查classpath指定的目錄及jar文件,如果沒有
{{{不}}}檢查當前目錄!
如果是javac才向下執行,如果是java.exe直接提示沒有類!
檢查sourcepath,有沒有需要類源文件,如果有就編譯它,如果沒有
檢查編譯文件列表,有沒有需要的類源文件,如果有就編譯它,如果沒有
提示缺少類!
3. FQA
這個FQA部分來自BBS 水木清華站 smth.org論壇
(這不是一個好FQA,我准備重寫一個,這裡權以充數!)
錯誤1:
'javac' 不是內部或外部命令,也不是可運行的程序或批處理文件。
(javac: Command not found)
產生的原因是沒有設置好環境變量path。Win98下在autoexce.bat中加入
path=%path%;c:\jdk1.2\bin,Win2000下則控制面板->系統->高級->環境變量->系統變
量...看到了?雙擊Path,在後面加上c:\jdk1.2\bin。當然我們假設JDK安裝在了
c:\jdk1.2目錄下(有點唐僧了?)...好像還要重啟系統才起作用...(//知道了!//西
紅柿)
好,再試試!javac HelloWorld
* 錯誤2:
HelloWorld is an invalid option or argument.
拜托,給點專業精神,java的源程序是一定要存成.java文件的,而且編譯時要寫全
.java呀。
OK, javac HelloWorld.java (這回總該成了吧?)
* 錯誤3:
HelloWorld.java:1: Public class helloworld must be defined in a file called
"HelloWorld.java".
public class helloworld{
^
這個問題嘛,是因為你的類的名字與文件的名字不一致。(誰說的,明明看到人家都有
這樣寫的 ) OK,准確地說,一個Java源程序中可以定義多個類,但是,具有public
屬性的類只能有一個,而且要與文件名相一致。還有,main方法一定要放在這個public
的類之中,這樣才能java(運行)這個類。另外一點是Java語言裡面是嚴格區分大小寫
的,初學者要注意呀。像上例中 helloworld 與 HelloWorld 就認為是不一樣,因而...
oh... 好,改好了,嘻嘻... javac HelloWorld.java
...(咦,怎麼什麼也沒有呀?)//faint 這就是編譯通過了!看看是不是多了一個
HelloWorld.class ?
(hehe..按書上教的:) java HelloWorld (!! 這個我知道,不是java HelloWorld.class
喲)
* 錯誤4:
Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld
呵呵,這個嘛,就是著名的類路徑(classpath)問題啦。實際上,類路徑是在編譯過程就
涉及的Java中的概念。classpath就是指明去哪裡找用到的類,就這麼簡單。由於我們的
HelloWorld沒用到其它的(非java.lang包中的)類,所以編譯時沒遇到這個問題。運行
時呢,就要指明你的類在哪裡了。解決方法嘛,可以用下面的命令運行:
java -classpath . HelloWorld
“.”就代表當前目錄。當然這樣做有點麻煩(是“太麻煩”!),我們可以在環境變量
中設置默認的classpath。方法就照上述設置path那樣。將classpath設為:
classpath=.;c:\jdk1.2\lib\dt.jar;c:\jdk1.2\lib\tools.jar 後面的兩個建議也設上
,以後開發用的著。
java -classpath . HelloWorld(再不出來我就不學java了)
* 錯誤5:
Exception in thread "main" java.lang.NoSuchMethodError: main
(//咣當)別,堅持住。看看你的代碼,問題出在main方法的定義上,寫對地方了嗎,
是這樣寫的嗎:
public static void main(String args[]) { //一個字都不要差,先別問為什麼了...
對,包括大小寫!
java -classpath . HelloWorld (聽天由命了!)
Hello World!
(faint!終於...)