茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1664690 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
IMG_00007.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

爪哇咖啡屋 : [分享]如何在 Solaris 和 MS Windows 系統環境中設定永久的 classpath

發表者 討論內容
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15766
[分享]如何在 Solaris 和 MS Windows 系統環境中設定永久的 classpath
如何在 Solaris 和 MS Windows 系統環境中設定永久的 classpath。

要使用任何的 JDK 軟體,你只需要將相對於 JDK 的 bin 目錄的路徑加到 PATH 環境變數中。你使用 CLASSPATH 變數來參考到其它的類別庫或是使用這定義的類別。例如,令 /myclasses 是使用這定義的套件。

OS: Solaris
Shell: C-shell, T-shell
將下列放在 $USER_HOME/.cshrc 中來永久的維持設定:

setenv JAVA_HOME /home/myname/jdk1.3
setenv CLASSPATH .:/myclasses
setenv PATH $PATH:$JAVA_HOME/bin

Shell: Bourn, K-Shell
將下列放在 $USER_HOME/.profile 中:

JAVA_HOME = /home/myname/jdk1.3
CLASSPATH = .:/myclasses
PATH = $PATH:$JAVA_HOME/bin

OS: MS Windows 95/98
將下列放在系統的 AUTOEXEC,BAT 檔案中:

set JAVA_HOME=C:\jdk1.3
set CLASSPATH=.;%JAVA_HOME%\myclasses
set PATH=%PATH%:%JAVA_HOME%\bin

OS: MS Windows NT

開啟控制台的系統圖示。從系統屬性對話框中選擇環境標籤,並將下列放在使用者變數區中:

JAVA_HOME C:\jdk1.3
CLASSPATH .;%JAVA_HOME%\myclasses
PATH %PATH%;%JAVA_HOME%\bin

更深入的資訊,請見
http://java.sun.com/j2se/1.4/docs/tooldocs/solaris/classpath.html
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15766
[轉貼]classpath的解說
可能粉多人對class path還是不太了解吧!?
所以冷日來轉個還不錯的說明,大家看看ㄅㄟ!
原文出處:http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/classpath.html
中文翻譯:

# 摘要

Class Path是Java執行時期環境用來搜尋類別與其它資源所用之路徑。Class Search Path(通常使用Class Path這個縮寫名稱比較為人所知)可以在呼叫SDK工具程式時使用-classpath或者是設定CLASSPATH環境變數。建議是使用-classpath選項,因為您可以獨立的為每一個應用程式設定,而不會影響其它的應用程式,且不會有其它的應用程式來改變這個值。

1
C:> sdkTool -classpath classpath1;classpath2...

-或-
1
C:> set CLASSPATH=classpath1;classpath2...


在這邊:
sdkTool:是一個命令列工具程式,像是java、javac 或 javadoc.
classpath1;classpath2:指向.jar、.zip或 .class檔案的Class Path,每一個classpath都應以檔名或目錄名稱(這與您所要設定的classpath有關)作結束。

* 對於一個包括.class的.jar或.zip檔案而言,class path要以.zip或.jar檔案的名稱作結束。
* 對於一個未命名的package而言,class path要以包括所有.class檔案的目錄作結束。
* 對於一個已命名的package而言,class path要以包括"根"package(完整package名稱的第一個package)的目錄名稱作結束。


多個路徑項目要以 分號 作區隔,使用set指令,重要的是等號兩邊不可有空白。

預設的class path是目前的目錄,設定CLASSPATH變數或使用-classpath命令列選項時會覆蓋這個預設,所以如果您要在目前的搜尋路徑中包括目前的目錄,您必須在新設定中包括"." 。

即不是目錄也不是文件檔案(.zip或.java)的classpath會被忽略。

# 說明


class path告訴SDK工具程式與應用程式要到哪邊尋找第三元件(third-party)與使用者定義的classes,也就是它們非Java延伸套件或非Java平台的一部份。在您使用javac編譯器編譯類別時,需要使用class path來找出任何所需的套件 -- 預設是目前的目錄,以方便找到這些類別。

Java2 SDK、JVM與其它的SDK工具藉由搜尋Java平台、classes、其它延伸classes與class path來找到所需的classes,以這個順序(要瞭解搜尋策略的細節,請看如何尋找Classes, How Classes Are Found),大部份應用程式所用的類別庫就可以利用延伸套件機制(extensions mechanism),在您載入一個不在目前目錄的類別或它的其它子目錄且它們不在伸延伸套件機制中時,您所要作的就是設定class path。

如果您從舊版本的SDK昇級上來,在您的啟動設定中可能包括已經不再使用的CLASSPATH設定,您必須將這些非特定應用程式的設定移除,像是classes.zip,一些使用到Java虛擬機器的第三元件應用程式可能會更改您的CLASSPATH環境變數,以將它們所使用的程式庫包括進去,這些設定則可以保留。


在您要求JVM或其它SDK工具程式時,您可以在使用Java工具程式時藉由-classpath選項來改變class path,或是使用CLASSPATH環境變數來指定。建議是使用-classpath選項會比設定CLASSPATH環境變數來得好,因為您可以為每一個應用程式分別設定,而不會影響其它的應 用程式,而其它應用程式也不會改變這個值。

Classes可以被儲存在目錄(資料夾)或是在文件檔案(archive files),Java平台的classes是被儲存在rt.jar,要瞭解文件檔案的細節或是class path如何運作的資訊,請看看稍後小節的 "瞭解class path與package名稱"。

重要、注意:一些舊版本的JDK軟體在預設的class path中包括了/classes項目,這些目錄的存在是為了被JDK軟體使用,而不應被應用程式classes使用。應用程式類別應該被放在JDK目錄結構之外的其它目錄,用這種方式,新的JDK就不會強迫您重新安裝應用程式classes,為了要與舊版本相容,必須使用/classes目錄作為類別庫的的應用程式,在目前的版本也可以運作,但不保證在未來的版本中仍可以運作。

# 使用SDK工具程式的-classpath選項


SDK工具程式 java、jdb、javac與javah擁有一個-classpath項目,當執行工具程式時,它用於取代由CLASSPATH環境變數所設定的路徑,在改變class path設定時,這是個建議使用的選項,因為每一個應用程式可以擁有自已所需的class path,而不會與其它應用程式相互干擾。

執行時期工具程式java也有一個 -cp 選項,這個選項是-classpath的縮寫名稱。

對於一些相當特殊的例子來說,java與javac都擁有一些項目可以讓您改變它們用來找到專屬類別庫的路徑,然而絕大多數的使用者從未需要使用這些項目。

# 使用CLASSPATH環境變數

一般而言,建議您使用-classpath命令列選項,就如同上面所提過的,這個小節將告讓您如何設定CLASSPATH環境變數,如果您想這麼作的話,或者是想清除之前安裝所留下的設定。

設定 CLASSPATH:

CLASSPATH環境變數可以藉由set指令來修改,格式是:


1
set CLASSPATH=path1;path2 ....


路徑應該以磁碟機代號開始,例如C:\,用這種方式,即使您切換至另一個磁碟機也可以找得到classes。(舉個例子來說,假如路徑項目以斜線開始而您在磁碟機D:,那麼classes將會預期是在D:,而不是C:)

清除 CLASSPATH:

如果您的CLASSPATH環境變數已經被設定為某個值,但是並不正確,或者是您的啟動檔案或是命令稿被設定了錯誤的路徑,您可以藉由以下來取消CLASSPATH的設定:

1
C:> set CLASSPATH=



這個指令只取消目前的命令列提示視窗CLASSPATH設定,您應當刪除或修正您的啟動設定,以保證您在下一次操作也會有正確的CLASSPATH設定。

改變啟動設定:

如果CLASSPATH被設定於系統啟動時,設定的地方則視您所使用的作業系統而定:
作業系統方法:
*Windows 95與98 檢查autoexec.bat中的set指令
*其它(Windows NT、Windows 2000、....)使用控制台中的系統工具來設定CLASSPATH變數

# 瞭解class path與package名稱

Java的classes被組織為packages,它們對應於檔案系統的目錄結構,但是不像檔案系統,每當您指定一個package名稱時,您指定整個package名稱而不是部份名稱,例如,java.awt.Button的package名稱是使用java.awt來指定。

例如,假設您要Java執行環境找到一個在 package名稱 utility.myapp 中名叫Cool.class的class,假如該目錄的路徑是C:\java\MyClasses\utility\myapp,您要設定class path以包括 C:\java\MyClasses

要執行這個應用程式,您可以使用下面的JVM指令:

1
c:> java -classpath C:\java\MyClasses utility.myapp.Cool


當應用程式執行時,JVM會使用class path設定來找到任一其它被定義於utility.myapp package(它被Cool類別使用)中的類別。

注意在指令中被指定的整個package名稱,這是不可能的,例如,設定class path包括C:\java\MyClasses\utility並使用指令java myapp.Cool,這麼作並不會找到class。

(您可能會想是什麼定義了一個class的package名稱,答案是package名稱是class的一部份,而且不可被修改,除非重新編譯)

注意:一個package指定機制的有趣的結果是,同一個package中的部份檔案可以存在於不同的目錄,對於每一個class而言,package名稱將會相同,但是每一個檔案的路徑將會以class path中不同的目錄開始。

目錄與文件檔案(archive files):


當classes被儲存在目錄(資料夾),像是c:\java\MyClasses\utility\myapp,那麼class path項目指向包括package名稱第一個元素的目錄(在這個例子中是c:\java\MyClasses,因為package名稱是utility.myapp)

但是當classes被儲存在文件檔案時(a.zip或.jar檔案),class path項目就是指向且包括.zip或.jar的檔案,例如,使用在.jar檔案中的類別庫,指令會像是:

1
C:> java -classpath C:\java\MyClasses\myclasses.jar utility.myapp.Cool


多個指定:

要尋找C:\java\MyClasses中與C:\java\OtherClasses中的classes,您可以這麼設定class path:


1
C:> java -classpath C:\java\MyClasses;C:\java\OtherClasses ...


注意兩個路徑是以分號作區隔。

指定順序:

指定多個class path項目的順序很重要,Java解碼器(interpreter)會以class path變數 中的順序來於目錄中尋找classes,在上面的例子中,Java解碼器首先會在目錄C:\java\MyClasses中尋找所需的類別,只有在它於該目錄中找不到適當名稱的類別時,解碼器才會於C:\java\OtherClasses目錄中尋找。

冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15766
[分享]JRE class loader
JRE/lib/ext 的用途是讓你放 third-party 的 library,
JRE 啟動時會把自動載入裡頭的 jar(應該說 classloader 需要 resolve class 時會到這個目錄下來找)。

主要的問題是,
安裝 JDK 時一般人可能會裝兩個 JRE,
一在 JDK 安裝目錄下的 JRE 目錄,
一在(預設) Program files 目錄下的 Java 目錄。
javac.exe 使用的是 JDK 所附的 private JRE(JDK/JRE),
而執行 Java 程式則要看你的 path 定。

JDK\bin\java.exe, JDK\jre\bin\java.exe 使用的是 private JRE,
program files\java\jre1.x.x\bin\java.exe, WinNT(Windows)\system32\java.exe 使用的是 public JRE。javaw.exe 同上。

比較保險的做法是把 third-party library jar file 在 private JRE/public JRE 各放一份,
這樣可確保編譯時可以 resolve third-party classes,或是設定 path 使得優先使用 private JRE(或乾脆就移除掉 public JRE)。

Eclipse 比較特別,
你可以只把 third-party 放在 public JRE 就好,
不需要放在 private JRE 也可以在編譯時讓編譯器去參考到所需要的 class。

javax 是 java "extention", 個人認為比較不像 "application",
既然是 Java 的一部份, 建議直接放 jre/lib/ext 下也無可厚非,
但版本的問題可能會是 nightmare.
個人認為還是用 "application specific" classpath 好.

Application 把 jar 直接往 jre/lib/ext 放, 不是不可以, 而是『不應該』.
如果在 jre/lib/ext 下有一個 a.jar, 在classpath中有一個 a.jar,
在 WEB-INF/lib 下也有一個 a.jar,哪一個會先被用呢?
uninstall 亦是個問題.

對新手來說, 建議把所有的 jar 往 jre/lib/ext 放可能方便些,
but may not be a good practice.

這裡有兩郭可以參考的文件:
http://cvs.apache.org/viewcvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/loader/
http://www.javaworld.com/javaworld/javatips/jw-javatip105.html

對於一般j2ee application or web application 來說,
j2ee application server or servlet container 都有提供標準的 java extention.
J2ee application server installation, normally, should not pollute your jre directory with extra extention jars.

但如果你的 applicaion/web-app 需要一些其他的 jar,
這些 jar file '最好' 放在 .war/.ear 中.
既便是你的兩個web-app擁有及使用不同版本的girl4j.jar,
container應該要很安全的把她們區隔開來
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15766
[轉貼]PATH 與 CLASSPATH
整理自竹師風之坊java精華區(bbs://140.126.22.6)

設定 path 是告訴系統, 執行檔程式位於什麼地方
主要是在執行 javac 跟 java 這兩個程式時使用的
也就是當你在命令列打入 javac xxx.java 和 java xxx 時
系統要去那裡找 javac 和 java 這兩個執行檔

設定 classpath 是告訴 Java
要使用或執行的 class 檔所在的路徑
比如說: 我們輸入 "java A" 命令 要求 Java 執行 A.class 這個類別檔時
Java 會由 classpath 所設定的路徑位置開始尋找 A.class
所以如果你沒有設定, 那 Java 就會跟你說他找不到
就算你是在 A.class 所在的路徑執行這個命令
也要在 classpath 裡面跟 Java 說 要到目前所在的路徑尋找 A.class
否則 Java 還是找不到的
另外 如果 A.class 裡面用到 B.class 時
在 classpath 設定中也要包含 B.class 所在的路徑

在較新版本的 SDK 中
並不需要在 classpath 裡面設定 SDK 原有的 class 檔或 jar 檔路徑
程式已經將路徑預設好了
你只需要設定額外的類別檔路徑就可以了

設定如下:

在 Windows 95/98 平台中

設定的方法為 用文字編輯器 (如小作家, notepad 等等)
編輯 c:\autoexec.bat
在裡面加入
SET PATH=C:\jdk\bin\
SET CLASSPATH=.;C:\java\class\;C:\java\jar\b.jar

如果這個檔案裡面原來就有 SET PATH 或 SET CLASSPATH
那就將路徑加在原來那行後面 並用 ; 隔開
( 在 J2SDK1.3 版之後的 Windows 版本
如果 CLASSPATH 沒有設定的話
Java 會預設為 CLASSPATH=.;
如果你有設定 則以設定的為主)

如果不設定
則可以用
c:\> c:\jdk\bin\java -cp c:\java\class\;c:\java\jar\b.class;c:\java\test\ xxx

來執行

設定好之後就可以簡化成
c:\> java xxx


在 Linux 底下
若路徑為
/usr/local/java/bin/java
/usr/local/java/bin/javac
/usr/local/class/a.class
/usr/local/jar/b.jar
/home/test/java/xxx.java
/home/test/java/xxx.class

則需在 /etc/profile (所有帳號共用) 加入
PATH=/usr/local/bin/:$PATH
CLASSPATH=./:/usr/local/class/:/usr/local/jar/b.jar
export PATH CLASSPATH

PS:
1. 以上設定好之後, 最好重新開機, 或重新登入,
反正就是要系統重新執行這個檔案
2. = 號兩側不可以有空白
3. Java 是會區分大小寫的, 不要把類別檔的大小寫 寫錯了
4. 設定中的 . 是代表使用者目前所在目錄

安裝其他套件之 ClassPath 設定

一般來說 當下載新的套件時
需要將新套件的路徑設定到 CLASSPATH 中
比如說
下載 JavaMail 裡面有 mail.jar 放在
c:\javamail\mail.jar 或是 /usr/local/javamail/mail.jar
那原來的 CLASSPATH 後面就要加上
;c:\javamail\mail.jar 或是 :/usr/local/javamail/mail.jar

還有要注意的是
如果安裝的是 server
如 JServ 或 Tomcat 這一類的程式
那也要把原來 classpath 設定的路徑
寫入到 Jserv 或 Tomcat 這些程式的設定檔中
這樣這些 server 才知道要去哪裡找 class
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15766
[轉貼]PATH的補充說明
轉錄自java連線版

作者: TAHO (癡人) 看板: java
標題: PATH & CLASSPATH
時間: Mon Jan 28 23:18:06 2002

看來這個問題又開始出現了

如果有用過 DOS 系統的人 應該可以瞭解 PATH 是在幹嘛的
這個 PATH 並不是給 Java 用的
早在沒有 Windows 的 DOS 時代 就有這個東西了.....
因為 DOS 沒有所謂的 "捷徑"
所以如果你要執行程式 那你必須給他 "完整路徑"
除非那個程式是在使用者的正處於的目錄

比如說 c:\windows\commands\edit.exe
如果你在
C:\windows\commands> edit

這樣當然可以
如果你是在
C:\> edit

他就會跟你說 找不到這個 edit.exe
因為這檔案不在 C:\ 底下
你也不能期望電腦會把你所有硬碟目錄全部都搜尋一遍 找出可能的檔案
如果這樣 那過不了多久你的硬碟可以就開始壞軌了
所以你必須打完整路徑
C:> c:\windows\commands\edit

但是每次都這樣打實在太麻煩??
所以就發明了一個 "系統變數",也就是 OS 會去使用的設定
只要這樣設定 PATH=C:\windows\commands\
那不論你在哪裡打 edit,他會先去找目前目錄底下有沒有這個程式
如果沒有 就去 PATH 的路徑找....
當然 不只有 edit,只要是打任何指令 在目前目錄底下找不到的
他就會去 PATH 設定的地方找
所以你瞭解為什麼要設定到 JDK 的 bin 目錄底下嗎?
因為 java.exe 跟 javac.exe 等等指令都在這目錄底下
所以你安裝完 JDK 之後有三種選擇可以執行命令
1. 直接到 javac.exe java.exe 所在的目錄底下去打指令 (麻煩...)
2. 每次打命令都打完整路徑 (通常很長....)
3. 設定系統變數 PATH 到 JDK 的 bin 目錄

同樣的所謂的 JVM 就好像是 OS 上面再啟動一個 OS
對 JVM 來說 CLASSPATH 就好像是對 OS 來說的 PATH
JVM 是由 java.exe 這個程式啟動的
而且別忘了 java.exe 並不是在使用者的路徑下
所以他會去 java.exe 所在的目錄底下去找 .class 檔
除非你的 .class 檔放在跟 java.exe 同一個目錄
否則他是找不到 .class 在哪裡的....
所以我們要設定一個路徑 讓 JVM 可以去這個路徑尋找你要他執行的 .class
所以你一樣有三種方法可以執行
1. 把所有的 .class 都放到 java.exe 的相對目錄底下 ( 很難管理... )
2. 每次都打完整路徑, 也就是使用 -cp 的選項
比如 java -cp .;c:\myclass\ Test
(其中那個句點 . 表示使用者打這個指令時 所在的目錄)
(常打的話很煩 ... )
3. 設定系統變數 CLASSPATH 到你的 class 的位置

至於系統變數怎麼設定 那要看你在那個平台 依據平台的設定
( 當然 系統變數不只這兩個, 就算你都沒有去設定
通常安裝完 OS, OS 就會預設一堆系統變數
你只是多手動的加了兩個 )

當然你都不設定也是可以??
只是很麻煩
比如說你安裝的路徑是
C:\JDK1.3.1\
D:\myclass\Test.class
其中 Test 用到 E:\extclass\Util.class
那你每次執行要打
c:\JDK1.3.1\bin\java -cp e:\extclass;d:\myclass Test
如果你不嫌煩的話 不用設定也是無所謂啦
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15766
[轉貼]安裝好 Jdk 設定 path 跟 classpath 路徑

[Java] 安裝好 Jdk 設定 path 跟 classpath 路徑


今天剛裝好 jdk 新版 jdk1.6.0_04,如要下載請到
這裡 下載,裝好之後當然底下要找編譯檔案,就是要去 bin 這個資料夾,然後找到 javac 跟 java 執行檔就可以了,不過如果你要在任何地方都要使用這個執行檔,就要去修改 path,設定方法如下

我的電腦右鍵->內容 k
然後選進階,然後環境變數

然後設定最上面的 path,然後加上

C:\Program Files\Java\jdk1.6.0_04\bin
設定 ClassPath:
.;C:\Program Files\Java\jdk1.6.0_04\lib;C:\Program Files\Java\jdk1.6.0_04\lib\tools.jar;
注意一下前面有一個點,這點大家很容易忘記,不然就是寫成 bat 檔案,然後開機自動執行就可以
SET PATH=C:\Program Files\Java\jdk1.6.0_04\bin; SET CLASSPATH=.;C:\Program Files\Java\jdk1.6.0_04\lib;C:\Program Files\Java\jd1.6.0_04\lib\tools.jar;
存檔為 java_path.bat 就可以,如果要檢查設定對不對,請打
echo %classpath% echo %path%
這行要看你是裝哪一個版本,版本不同就會不一樣,所以要設定正確,設定好之後,按開始->執行->打入 cmd,然後打 javac,就會看到 help 檔案,這樣就可以了,如下圖


http://www.javaworld.com.tw/jute/post/view?bid=29&id=16093&sty=1&tpg=1&age=0
http://www.javaworld.com.tw/jute/post/view?bid=29&id=22589&tpg=1&ppg=1&sty=1


原文出處:[Java] 安裝好 Jdk 設定 path 跟 classpath 路徑 | 小惡魔 - 電腦技術 - 工作筆記 - AppleBOY
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15766
[轉貼]CLASSPATH 是什麼?

CLASSPATH 是什麼?

假 設你在C:\workspace下寫了個HelloWorld.java,並順利使用編譯器javac將之編譯為HelloWorld.class,在不 切換路徑的情況下,可以直接執行java HelloWorld來載入HelloWorld.class並運行當中所定義的行為。

如果你切換到C:\底下或是其它路徑底下,那麼該如何載入HelloWorld.class並執行呢?以下並不是正解:

java C:\workspace\HelloWorld

首先你要知道java這個指令是作什麼用的? 執行java,其實就是啟動JVM,之後接下類別名稱,表示由JVM載入該類別的.class並執行。

PATH 是什麼? 中提過,當你在實體作業系統下執行某個指令時,作業系統會依PATH中的路徑資訊,試圖找到可執行的檔案(例如對Windows來說,就是.exe、.bat,對Linux等就是有執行權限的檔案)。

為什麼需 要 JVM? 中則提過,JVM是Java程式唯一認得的作業系統,對JVM來說,可執行檔就是副檔名為.class的檔案。 當你要想在JVM中執行某個它的可執行檔(.class)時,則JVM會依CLASSPATH中的路徑資訊來尋找。

作個簡單的比照,可以很清楚地對照PATH與CLASSPATH:
實體作業系統PATH中的路徑資訊來尋找 可執行指令(對Windows就是.exe、.bat等,對Linux等就是有執行權限的檔案)。
JVM
(虛擬作業系統)依 CLASSPATH中的路徑資訊來尋找 可執行指令(.class檔案)。


如何在啟動JVM時告知可執行檔(.class)的位置?可以使用-classpath引數來指定:
java -classpath c:\workspace HelloWorld

指定可執行檔(.class)時,不用加上.class副檔名,這跟在Windows下執行javac時,不用特別再加上副檔名(javac.exe)是類似的。如果有多個路徑資訊,則可以用分別區隔。-classpath有個縮寫形式-cp。例如:
java -cp c:\workspace;c:\classes HelloWorld

與PATH類似地,JVM會依路徑的順序,找尋是否有對應的類別檔案, 先找到先贏,先找到先載入。如果在JVM的CLASSPATH路徑資訊中都找不到指定的類別檔案,則會出現 java.lang.NoClassDefFoundError的資訊。

如 果使用Java開發了一些程式作為程式庫,這些程式庫中的類別檔案,會封裝為JAR(Java Archive)檔案,也就是副檔名為.jar的檔案。 JAR檔案實際上是使用ZIP格式作壓縮,當中包含一堆.class檔案,之後還會介紹如何製作 JAR檔案。總之,現在如果你拿到一個JAR檔案,如何在CLASSPATH中設定?

答案是 將JAR檔案當作一個特別的資料夾,例如,你拿到一個abc.jar與xyz.jar,放在C:\lib底下,則執行時如果使用到該JAR檔案中的類別,則可以如下:
java -cp c:\workspace;c:\lib\abc.jar;c:\lib\xyz.jar SomeApp


在使用IDE的時候,會在IDE的專案中設定(或有時稱匯入)所謂的「程式庫」,其實就是在IDE專案環境下的CLASSPATH中設定JAR檔案的位置與名稱。

事實上,不只執行時可以設定CLASSPATH, 編譯時也會需要設定CLASSPATH,例如你開發了一個Message.java:
public class Message {
private String text;
public Message(String text) {
this.text = text;
}
public String getText() {
return text;
}
}

編譯完的Message.class是放在c:\classes之下。現在你在c:\workspace下寫了個HelloWorld.java:
public class HelloWorld {
public static void main(String[] args) {
Message message = new Message("Hello!World!");
System.out.println(message.getText());
}
}

如果你直接編譯HelloWorld.java,則會出現以下的訊息:



表面字義看來,叫作不認得Message是什麼符號,這其實是編譯器不知道你的Message定義檔在哪?也就是編譯器找不到Message.class在哪!你在編譯時,必須告知所使用到的類別檔案是放在哪邊,指定的方式也是靠CLASSPATH:
javac -cp c:\classes HelloWorld.java

編譯器如果看到原始碼中有使用到Message這個名稱,就會試著找看看在類別路徑中,有無Message.class,如果有就讀取剛中的資訊,看看相關方法等定義是否正確,然後才進行編譯。

那麼要執行時,也是得指定CLASSPATH,不過以下指定卻會發生問題:


原 因其實很簡單,因為你指定的類別路徑是c:\classes,所以JVM只在c:\classes下找相關的.class檔案,而當中並沒有 HelloWorld.class,因為HelloWorld.class是位於c:\workspace下。你要這樣指定才正確:
java -cp c:\workspace;c:\classes HelloWorld

那為什麼執行第一個HelloWorld時,不用特別指定CLASSPATH? 預設的CLASSPATH就會讀取當前目錄下的.class,但是如果你自行指定了CLASSPATH,則以你指定的為主。

如果有些類別路徑很常使用,則你也可以透過環境變數設定,例如:
SET CLASSPATH=C:\classes;c:\lib\abc.jar;c:\lib\xyz.jar


當 你啟動JVM時,也就是執行java時,或者是編譯時,也就是使用javac時,不指定CLASSPATH,則會讀取環境變數資訊中的CLASSPATH 變數設定。同樣地,這個設定在關閉這個文字模式之後,就會失效,下次必須重新設定。如果你希望每次開啟文字模式都可以套用某個CLASSPATH設定的 話,則可以設定在系統變數或使用者變數中。如果你執行或編譯時,使用了-cp或-classpath來指定類別的路徑所在,則以-cp或-classpath設定的為主。

實際上,CLASSPATH的路徑設定,是給應用程式類別載入器(AppClassLoader)使用的資訊。想要了解類別載入的方式,則要了解類別載入器機制,這是進階議題,要在較後面的文件中才會談到。

在Java SE 6前,如果目錄下有很多.jar檔案,則要一個一個.jar檔案分別指定,才可以正確的設定Classpath,例如您可能在執行程式時,如下指定Classpath:
java –cp .;c:\jars\a.jar;c:\jars\b.jar cc.openhome.JNotePad

在Java SE 6中,您可以使用'*'來指定某個目錄下的所有.jar檔案,例如上例在Java SE 6中,可以如下指定:
java –cp .;c:\jars\* cc.openhome.JNotePad

Java SE 6中Classpath新的指定方式,也適用在系統環境變數的設定上。


原文出處:CLASSPATH 是什麼?
前一個主題 | 下一個主題 | 頁首 | | |



Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|