設置類路徑
結構
可通過對 JDK 工具使用 -classpath 選項(首選方法)或設置 CLASSPATH 環境變量來設置類路徑。
??? C:> jdkTool -classpath path1;path2...
??? C:> set CLASSPATH=path1;path2...
每個 path 以文件名或目錄結尾,該文件名或目錄取決于將類路徑設置成什么:
對于包含 .class 文件的 .zip 或 .jar 文件,路徑以 .zip 或 .jar 文件名結尾。
對于未命名包中的 .class 文件,路徑以包含 .class 文件的目錄結尾。
對于已命名包中的 .class 文件,路徑以包含“root”包(完整包名中的第一個包)的目錄結尾。
用分號來分隔多個項目。使用 set 命令時,需要省略等號兩邊的空格(=)。其中 jdkTool 可以為 java、javac、javadoc,等等。有關詳細列表,參見 JDK 開發工具。
說明
類路徑告訴 Java 應用程序去哪里查找第三方和自定義類 -- 即不是 Java 擴展或 Java 平臺一部分的類。在 JDK 1.2 中,JVM 和其他 JDK 工具通過依次搜索平臺庫、庫擴展和類路徑來查找類(有關搜索策略的詳細信息,參見如何查找類)。
多數應用程序的類庫都會充分利用擴展機制。因此,只有想要加載某個類庫 (a) 未位于當前目錄或其分枝包中 且 (b) 未位于擴展機制所指定的位置時,才需設置類路徑。
如果用戶是從舊版本 JDK 升級而來,則啟動設置可能包括不再需要的 CLASSPATH 設置。這時應該刪除任何非應用程序特定的設置。有些使用 Java 虛擬機的第三方應用程序可能修改 CLASSPATH 環境變量以包括它們使用的類庫。這種設置可以保留。
可通過在調用 JVM 或其他 JDK 工具時使用 Java 工具的 -classpath 選項改變類路徑(例如: java -classpath ...)。這是改變類路徑的首選方法。還可通過使用 CLASSPATH 環境變量改變類路徑。
注意:JDK 1.2 缺省類路徑是當前目錄。設置 CLASSPATH 變量或使用 -classpath 命令行開關將覆蓋缺省值,因而如果想要在搜索路徑中包括當前目錄,則必須在新設置中包括“.”。
類可以存儲在目錄(文件夾)或歸檔文件(例如 classes.zip 或 classes.jar)中。有關歸檔文件的詳細信息和類路徑的工作原理,參見本文檔最后的理解類路徑和包名。
?
重要說明:JDK 舊版本在缺省類路徑中還包括 <jdk-dir>/classes 項。該目錄僅供 JDK 使用,且不用于應用程序類。應用程序類應該放置在 JDK 外部的目錄。這樣,安裝新 JDK 時不必需要重新安裝應用程序庫。為了與舊版本的兼容性,使用 <jdk-dir>/classes 目錄作為類庫的應用程序在當前版本中仍能運行,但不能保證在以后的版本中它們還能運行。
使用 Java 工具的 -classpath 選項
Java 工具 java、jdb、javac 和 javah 具有 -classpath 選項,在工具運行時它將取代缺省類路徑或由 CLASSPATH 環境變量所指定的類路徑。這是改變類路徑設置的推薦方法,因為這樣每個應用程序可具有它所需的類路徑而又不會干擾其他應用程序。
運行時工具 java 和 jdb 還具有 -cp 選項。該選項是 -classpath 的縮寫。
對于非常特殊的情況,java 和 javac 都具有開關,使得可改變它們使用的路徑以查找它們自己的類庫。但是,絕大多數用戶從來都不會用到這些開關。
使用 CLASSPATH 環境變量
如前一節中所述,一般用戶將想要使用 -classpath 命令行選項。本節將介紹如何設置 CLASSPATH 環境變量或清除以前安裝遺留下的設置。
設置 CLASSPATH
在 DOS 提示符下,可用 set 命令修改 CLASSPATH 環境變量。其格式為:
?? set CLASSPATH=path1;path2 ...
路徑應該以指定驅動器的字母開頭,例如 C:\...。這樣,在偶然切換到不同驅動器時仍可找到類(例如,如果路徑項以 \... 開頭,并且當前位于驅動器 D: 上,則所需的類將在 D: 而不是 C: 驅動器上找)。
清除 CLASSPATH
如果 CLASSPATH 環境變量被設置成不正確的值,或啟動文件或腳本程序設置了不正確路徑,則可通過使用下列命令清除 CLASSPATH:
? C:> set CLASSPATH=
該命令僅清除當前會話的 CLASSPATH。要確保在以后的會話中具有正確的 CLASSPATH 設置,則應該刪除或修改啟動設置。
更改啟動設置
如果在系統啟動時設置 CLASSPATH 變量,則查找它的位置取決于所使用的操作系統:
? 操作系統 方法
Windows 98 和
Windows 95 檢查 autoexec.bat 文件中的 set 命令。
Windows NT 啟動“控制面板”,選擇“系統”,單擊“環境”選項卡,并在“用戶變量”部分中,檢查 CLASSPATH 變量。
理解類路徑和包名
Java 類被組織成包,而這些包被映射到文件系統中的目錄。但是與文件系統不同的是,無論何時指定包名,都應指定完整包名 -- 永遠不要僅指定它的一部分。例如,java.awt.Button 的包名總是應指定為 java.awt。
例如,假定想要 Java 運行環境在包 utility.myapp 中查找名為 Cool.class 的類。如果該目錄的路徑為 C:\java\MyClasses\utility\myapp,則應該將類路徑設置成包含 C:\java\MyClasses。
要運行該應用程序,可使用下述 JVM 命令:
C:>? java -classpath C:\java\MyClasses utility.myapp.Cool
當該應用程序運行時,JVM 使用類路徑設置查找在 utility.myapp 包中定義的任何其他類。
注意:應在命令中指定完整包名。例如,設置類路徑包含 C:\java\MyClasses\utility 并使用命令 java myapp.Cool 是不可能的,因為這找不到該類。
(您可能想知道用什么定義類的包名。答案是:包名是類的一部分,并且不能修改,除非重新編譯該類。)
注意:包規范機制一個有趣的結果是,屬于相同包的多個文件實際上可存在于不同的目錄中。對于每個類,包名都是相同的,但是每個文件的路徑可從類路徑中的不同目錄開始。
文件夾和歸檔文件
當類存儲在目錄(文件夾)中時,例如 c:\java\MyClasses\utility\myapp,則類路徑項指向包含包名第一個元素的目錄(在這里為 C:\java\MyClasses,因為包名是 utility.myapp)。
但是當類存儲在歸檔文件(.zip 或 .jar 文件)中時,類路徑項則是該 .zip 或 .jar 文件的路徑。例如,要使用位于 .jar 文件中的類庫,則命令應該類似下述形式:
?? java -classpath C:\java\MyClasses\myclasses.jar utility.myapp.Cool
多重指定
要在目錄 C:\java\MyClasses 和 C:\java\OtherClasses 中查找類文件,則可將類路徑設置為:
?? java -classpath C:\java\MyClasses;C:\java\OtherClasses ...
注意兩個路徑之間用分號分隔。
指定次序
指定多個類路徑項的次序是相當重要的。Java 解釋器將按照目錄在類路徑變量中的次序在各個目錄中查找類。在上例中,Java 解釋器首先在目錄 C:\java\MyClasses 中查找需要的類。只有當它在該目錄中沒有找到該類時,解釋器才能到 C:\java\OtherClasses 目錄中查找
??? 這是我一年前學Java時的想法,為什么有那些想法?很簡單,人云亦云罷了。既然那么多“高手”都這么說,那么多“精通”Java和C++的人都那么說,自然而然就信了。
??? 就這么過去了一年,對Java也越來越熟悉。自己依然是個初學者,而且相信不上升到布盧斯.艾克爾那個高度,就別想說自己精通C++和Java!
??? 雖說仍舊是初學者,卻對國內那些“高手高手高高手”們的一些言論有了懷疑:Java不比C++慢!然而無論我在哪個論壇上,那個技術群里頭發表這個觀點,立刻會有一群“高手”來糾正,甚至有一次一個號稱“一般不學語言,要學兩個禮拜就能搞定”的“高手”很鄭重其事地向我說明原理。當我了解到此人Java才學了一個月的時候,實在是無語了。還要一次一個高手批駁我,于是乎小心問了句,了解C語言里malloc和free函數的機制與否。此“高手”很不屑地告訴我:C++里的new 和 delete就能搞定,malloc早就沒用了。又無語:也許他用的“C++"是他自己發明吧。
?? 只想問一句那些“高手”,看過近年來Java PK C++的一些精彩報告沒?那些報告可是國外權威機構的文獻啊!是通過實驗得來的數據!
?? 還想問一句:你們說Java慢,是什么人,什么時候說的?那些言論的源頭,大多數是Java 1.2時代以前的啊。
? 說Java比C++慢的人,是否真的親自寫過測試代碼?(雖說我的代碼不能算精確,但也好歹做過近十次的實驗,用了好幾種不同的JVM或Cpp編譯器,Java大獲全勝)
? 說Java比C++慢的人,是否了解JVM的運行機制?(我只能說我了解一些罷了)
? 說Java比C++慢的人,是否有拿得出手的報告或實驗?(可惜,從來沒遇到過)
? 說Java比C++慢的人,請去學習一下唯物論!
??而且為什么只有在國外才有那么多人認為Java快,只有國外的科研機構才花費時間和精力去做那些被很多國內程序員斥為“沒用”(和好多程序員聊天時,他們這么認為)的實驗?是中國的程序員都是天才么?還是中國的計算機業太“先進”了,不需要去關心這些東西呢?
? 實在是發人深?。。。?br />??? ?? 微軟的J#我從開始接觸就覺得是個比較有趣的東西:一個長得特像Java的混血兒。
?? 前些天逛論壇,偶見一群人在討論J#的前途問題,很多人說那東西“根本不如C?!?,“甚至還不如VB。NET”。我的想法是:他們根本不了解.NET。
?? J#的目的是為了Java程序員能遷移到.NET平臺而開發的。換而言之,J#是Java程序員準備的,而不是初學者。誠然,我認為C#擁有更優雅的語法,但是對于.NET這個平臺本身而言,無論用什么語言(當然是在.NET上的程序語言),它們最終都是CLR。VB。NET,C#,J#,Delphi.NET.....各種語言的優劣在已經變得很不重要了--你熟悉那種,那種就是最好的!因為它們本質上幾乎沒差別的,極端說法是,.NET 語言僅僅是”外觀“不同罷了。
??? 就這點來說,.NET要比Java更有靈活性,雖然我是Java的忠實跟隨者。
??? 不過我們也看到了關于Java的一些有趣的新聞:去年出現了一種JPython,用Java翻譯的運行于JVM上的“Python”。呵呵,不妨大膽地猜測,未來會出現更多的"JC++","JPascal",:JBasic",甚至是“JC#”,那么那時,Java會更像一個平臺,語言的靈活性將更高!
據人說效果特別好,在Watson's 有的賣。
問題是,西安好像只有一家Watson's 專賣店,在南大街,怪遠的,天熱怕跑。記得去年易初蓮花Watson's干姜汽水和蘇打水大降價,我還買了老多,只是不知道那里有那牙膏沒?
效果好的話,給表哥推薦,縣城就有Watson's專賣店,門面要比西安的氣派多了,導購MM也比南大街那家要漂亮。
唯一不爽的是價格有些貴,33塊誒。
??? 今天上周四的課,一天都是實驗。有我最鄙視的VB,也有感覺最棒的系統編程。一直想在課表上把“系統編程”改名為“藝術編程”。
??? 昨天晚上慶慶告訴我她決定考研,善變看來是女孩子們的普遍的性格。不過現在,的確到了決定些什么的時候了。
??? 自認為不適合在象牙塔里自度春秋,所以旁人的決定對我絲毫沒有什么影響。很慶幸父母一直尊重我的選擇。從高考填報志愿,到是否考研?;旧隙际亲约赫f的算。
??? 父親只是告訴我路永遠是自己的,不過既然自己選了,就一定要努力去走好!當他對我說這話時我明白,這也他這輩子唯一的格言。 ????? 周末對現在我來說,實在是稱不上周末。
????? 今天頭暈了一天,部分是給那個HTML整壞的。終于體會到用記事本寫HTML語言是多么痛苦的一件事情。 英語三天沒復習過,六級還沒過,是有些著急。寒假的時候還計劃這學期復習日語考級,可惜這個計劃看來是沒法實施,推后到大四再說吧。寒假還有個完善“文曲星”GVmark編譯器和擴充GVmark類庫的打算,現在也只能Say Sorry
????? 慶慶改用MSN,這才發現我的MSN終于有用了。昨天打電話回家,老爸問我QQ,居然忘了^_^.
????? 現在我唯一要做的,就是珍惜時間。長這么大,第一次這么自覺。
???? 很經典的"轉圈數數踢人"問題,老早以前做的東西
???? 這里是我的解法,利用STL里的List構建Ring List
???? 頭文件:
? //:This part is partly from Bruce Eckel's source code .
// thought he don't hear of me at all ^_^
// Making a "ring" data structure from the STL
#ifndef RING_H
#define RING_H
#include<iterator>
#include<list>
using namespace std;
template <class Type> class Ring{
?list<Type> lst;
public:
?class iterator;
?friend class iterator;
?class iterator :public std::iterator<std::bidirectional_iterator_tag,Type,ptrdiff_t>{
??typename list<Type>::iterator it;
??list<Type>* r;
?public:
??iterator(list<Type>&lst,const typename list<Type>::iterator& i):it(i),r(&lst){}
??bool operator==(const iterator& x)const{
???return it==x.it;
??}
??bool operator!=(const iterator& x)const{
???return!(*this==x);
??}
??typename list<Type>::reference operator*()const{
???return *it;
??}
??iterator& operator++(){
???++it;
???if(it==r->end())
????it=r->begin();
???return *this;
??}
??iterator operator++(int){
???iterator tmp=*this;
???++*this;
???return tmp;
??}
??iterator &operator--(){
???if(it==r->begin())
????it=r->end();
???--it;
???return *this;
??}
??iterator operator--(int){
???iterator tmp=*this;
???--*this;
???return tmp;
??}
??iterator insert(const Type& x){
???return iterator(*r,r->insert(it,x));
??}
??
??//I have to recognize that the iterator is not so smart as
??//we expected .If the element in the list is erased ,the
??//iterator will be lost and point to a null.The shortage of
??//the stupid iterator will been seen the the Josephus.cpp
??//we have to use a template variable to storage the next iterator
??//of the deleting iterator.If not ,the programe will be nightmare
??iterator erase(){
???return iterator(*r,r->erase(it));
??}
?};
?void push_back(const Type& x){lst.push_back(x);}
?iterator begin(){return iterator(lst,lst.begin());}
?int size(){return lst.size();}
};
#endif
實現文件:
//:Using circle list to solve Josephus problem
//:version 1.01
//:author Murainwood 12/3/2006
#include<iostream>
#include"Ring.h"
void? main(){
?//enter the number of people and the index
?int n,m;
?cout<<"Enter the Number of Contestants?";
?cin>>n>>m;
???
?
??? Ring<int> ring;
?for(int i=1;i<=n;i++) ring.push_back(i);
?//determine the iterator
?//it is reasonable? to declare two iterator
??? Ring<int>::iterator tmp=ring.begin();
?Ring<int>::iterator it=tmp;
?
?//without the iterator tmp ,if we erase the it
?//the it will lost ,so the loop can not? work
?for(int index=0;index<n-1;index++){
???it=tmp;
??for(int j=0;j<m-1;j++){it++;tmp++;}
???tmp++;
????? cout<<"Delete person"<<*it<<endl;
???it.erase();
???
?}
?it=ring.begin();
?cout<<"The result is person"<<*it<<endl;
}
//:finished
???? 這個Ring List有很高的效率和安全性,并且通用性也比較好
???? 這里也發現個問題,就是STL里的Iterator 還不夠"聰明",這也是為什么我會在程序里多加個迭代器:tmp,
因為如果我調用了it.erase();那么這個迭代器就丟失了,程序也就無非運行下去.
???? 這樣我們很容易地想,如果調用了it.erase()后,指針不是丟失,而是指向下一個元素該多好啊!
???? 很遺憾,現階段標準STL庫里的List沒有這個功能.猜想是因為List的物理存儲結構的緣故,如果讓他的迭代器變得如我們想像得那么"聰明",那么花費可能會有些大.
??? 還沒有驗證過boost庫,不知道那里的迭代器是否會更人性化些
???? 有時間研究一下相關的STL源碼,寫一個"聰明些"的迭代器.
???????生于公元1984年,巨蟹座.
?????? 童年是在家鄉小鎮的鎮政府大院度過的.大院外邊就是小鎮短短的街道.一條不算寬的運河在鎮邊緩緩
流淌.
?????? 小鎮對于我而言,是春天田野里的油菜花,夏天晚上的星星,秋天路邊的法國梧桐,和冬天翠綠的竹園--我可愛的小鎮被田野所環抱著.
?????? 小時候很文靜,幾乎像個女孩子一樣乖.
?????? 小學,初中,都是在小鎮上的.
?????? 十六歲之前我的世界,大部分都是那個長江岸,黃海濱的小鎮.
?????? 十六歲那年考上了縣城里的高中,縣城離有十五分鐘車程.
?????? 縣城也很小.一座精致的海邊小城,雖說是城市,可大多數居民卻也過著閑淡的生活.
???????三年后,我想去看看外邊更遠的世界,來到了西安,這座和我家鄉截然不同的世界.
??????
??????
| |||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
---|---|---|---|---|---|---|---|---|---|
29 | 30 | 1 | 2 | 3 | 4 | 5 | |||
6 | 7 | 8 | 9 | 10 | 11 | 12 | |||
13 | 14 | 15 | 16 | 17 | 18 | 19 | |||
20 | 21 | 22 | 23 | 24 | 25 | 26 | |||
27 | 28 | 29 | 30 | 31 | 1 | 2 | |||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
常用鏈接
留言簿(3)
隨筆分類
隨筆檔案
- 2007年6月 (3)
- 2007年1月 (1)
- 2006年11月 (1)
- 2006年10月 (6)
- 2006年9月 (1)
- 2006年8月 (2)
- 2006年7月 (8)
- 2006年6月 (1)
- 2006年5月 (3)
- 2006年4月 (4)
相冊
搜索
最新評論

- 1.?re: 一點小感想:為什么那么多人說Java慢???[未登錄]
- 評論內容較長,點擊標題查看
- --夏
- 2.?re: 一點小感想:為什么那么多人說Java慢???[未登錄]
-
莫名被最后一句話戳中笑點@fjchenq
- --aa
- 3.?re: 一點小感想:為什么那么多人說Java慢???
- 評論內容較長,點擊標題查看
- --嗷嗷嗷
- 4.?re: 一點小感想:為什么那么多人說Java慢???[未登錄]
- c++存在一個函數表,訪問一段代碼至少要訪問兩次內存,所以在對性能要求很高的操作系統內核上不適宜使用
- --光光
- 5.?re: 一點小感想:為什么那么多人說Java慢???
- Java桌面應用慢到死!垃圾一樣的東西
- --的