classpath和jar

在Java中宝泵,我們經(jīng)常聽到classpath這個東西粗恢。網(wǎng)上有很多關(guān)于“如何設(shè)置classpath”的文章梆造,但大部分設(shè)置都不靠譜洛心。

到底什么是classpath固耘?

classpath是JVM用到的一個環(huán)境變量,它用來指示JVM如何搜索class词身。

因為Java是編譯型語言厅目,源碼文件是.java,而編譯后的.class文件才是真正可以被JVM執(zhí)行的字節(jié)碼法严。因此损敷,JVM需要知道,如果要加載一個abc.xyz.Hello的類深啤,應(yīng)該去哪搜索對應(yīng)的Hello.class文件拗馒。

所以,classpath就是一組目錄的集合溯街,它設(shè)置的搜索路徑與操作系統(tǒng)相關(guān)诱桂。例如,在Windows系統(tǒng)上呈昔,用;分隔挥等,帶空格的目錄用""括起來,可能長這樣:

C:\work\project1\bin;C:\shared;"D:\My Documents\project1\bin"

在Linux系統(tǒng)上堤尾,用:分隔肝劲,可能長這樣:

/usr/shared:/usr/local/bin:/home/liaoxuefeng/bin

現(xiàn)在我們假設(shè)classpath.;C:\work\project1\bin;C:\shared,當(dāng)JVM在加載abc.xyz.Hello這個類時,會依次查找:

  • <當(dāng)前目錄>\abc\xyz\Hello.class
  • C:\work\project1\bin\abc\xyz\Hello.class
  • C:\shared\abc\xyz\Hello.class

注意到.代表當(dāng)前目錄涡相。如果JVM在某個路徑下找到了對應(yīng)的class文件哲泊,就不再往后繼續(xù)搜索。如果所有路徑下都沒有找到催蝗,就報錯切威。

classpath的設(shè)定方法有兩種:

在系統(tǒng)環(huán)境變量中設(shè)置classpath環(huán)境變量,不推薦丙号;

在啟動JVM時設(shè)置classpath變量先朦,推薦。

我們強烈不推薦在系統(tǒng)環(huán)境變量中設(shè)置classpath犬缨,那樣會污染整個系統(tǒng)環(huán)境喳魏。在啟動JVM時設(shè)置classpath才是推薦的做法。實際上就是給java命令傳入-classpath-cp參數(shù):

java -classpath .;C:\work\project1\bin;C:\shared abc.xyz.Hello

或者使用-cp的簡寫:

java -cp .;C:\work\project1\bin;C:\shared abc.xyz.Hello

沒有設(shè)置系統(tǒng)環(huán)境變量怀薛,也沒有傳入-cp參數(shù)刺彩,那么JVM默認(rèn)的classpath.,即當(dāng)前目錄:

java abc.xyz.Hello

上述命令告訴JVM只在當(dāng)前目錄搜索Hello.class枝恋。

在IDE中運行Java程序创倔,IDE自動傳入的-cp參數(shù)是當(dāng)前工程的bin目錄和引入的jar包。

通常焚碌,我們在自己編寫的class中畦攘,會引用Java核心庫的class,例如十电,String知押、ArrayList等。這些class應(yīng)該上哪去找鹃骂?

有很多“如何設(shè)置classpath”的文章會告訴你把JVM自帶的rt.jar放入classpath台盯,但事實上,根本不需要告訴JVM如何去Java核心庫查找class畏线,JVM怎么可能笨到連自己的核心庫在哪都不知道爷恳?

不要把任何Java核心庫添加到classpath中!JVM根本不依賴classpath加載核心庫象踊!

更好的做法是温亲,不要設(shè)置classpath!默認(rèn)的當(dāng)前目錄.對于絕大多數(shù)情況都夠用了杯矩。

jar包

如果有很多.class文件栈虚,散落在各層目錄中,肯定不便于管理史隆。如果能把目錄打一個包魂务,變成一個文件,就方便多了。

jar包就是用來干這個事的粘姜,它可以把package組織的目錄層級鬓照,以及各個目錄下的所有文件(包括.class文件和其他文件)都打成一個jar文件,這樣一來孤紧,無論是備份豺裆,還是發(fā)給客戶,就簡單多了号显。

jar包實際上就是一個zip格式的壓縮文件臭猜,而jar包相當(dāng)于目錄。如果我們要執(zhí)行一個jar包的class押蚤,就可以把jar包放到classpath中:

java -cp ./hello.jar abc.xyz.Hello

這樣JVM會自動在hello.jar文件里去搜索某個類蔑歌。

那么問題來了:如何創(chuàng)建jar包?

因為jar包就是zip包揽碘,所以次屠,直接在資源管理器中,找到正確的目錄雳刺,點擊右鍵帅矗,在彈出的快捷菜單中選擇“發(fā)送到”,“壓縮(zipped)文件夾”煞烫,就制作了一個zip文件。然后累颂,把后綴從.zip改為.jar滞详,一個jar包就創(chuàng)建成功。

假設(shè)編譯輸出的目錄結(jié)構(gòu)是這樣:

package_sample
└─ bin
   ├─ hong
   │  └─ Person.class
   │  ming
   │  └─ Person.class
   └─ mr
      └─ jun
         └─ Arrays.class

這里需要特別注意的是紊馏,jar包里的第一層目錄料饥,不能是bin,而應(yīng)該是hong朱监、ming岸啡、mr。如果在Windows的資源管理器中看赫编,應(yīng)該長這樣:


如果長這樣:

說明打包打得有問題巡蘸,JVM仍然無法從jar包中查找正確的class,原因是hong.Person必須按hong/Person.class存放擂送,而不是bin/hong/Person.class悦荒。

jar包還可以包含一個特殊的/META-INF/MANIFEST.MF文件,MANIFEST.MF是純文本嘹吨,可以指定Main-Class和其它信息搬味。JVM會自動讀取這個MANIFEST.MF文件,如果存在Main-Class,我們就不必在命令行指定啟動的類名碰纬,而是用更方便的命令:

java -jar hello.jar

jar包還可以包含其它jar包萍聊,這個時候,就需要在MANIFEST.MF文件里配置classpath了悦析。

在大型項目中寿桨,不可能手動編寫MANIFEST.MF文件,再手動創(chuàng)建zip包她按。Java社區(qū)提供了大量的開源構(gòu)建工具牛隅,例如Maven,可以非常方便地創(chuàng)建jar包酌泰。

小結(jié)

JVM通過環(huán)境變量classpath決定搜索class的路徑和順序媒佣;

不推薦設(shè)置系統(tǒng)環(huán)境變量classpath,始終建議通過-cp命令傳入陵刹;

jar包相當(dāng)于目錄默伍,可以包含很多.class文件,方便下載和使用衰琐;

MANIFEST.MF文件可以提供jar包的信息也糊,如Main-Class,這樣可以直接運行jar包羡宙。

本文轉(zhuǎn)載自:https://www.liaoxuefeng.com/wiki/1252599548343744/1260466914339296
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末狸剃,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子狗热,更是在濱河造成了極大的恐慌钞馁,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匿刮,死亡現(xiàn)場離奇詭異僧凰,居然都是意外死亡,警方通過查閱死者的電腦和手機熟丸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進(jìn)店門训措,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人光羞,你說我怎么就攤上這事绩鸣。” “怎么了纱兑?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵全闷,是天一觀的道長。 經(jīng)常有香客問我萍启,道長总珠,這世上最難降的妖魔是什么屏鳍? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮局服,結(jié)果婚禮上钓瞭,老公的妹妹穿的比我還像新娘。我一直安慰自己淫奔,他們只是感情好山涡,可當(dāng)我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著唆迁,像睡著了一般鸭丛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上唐责,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天鳞溉,我揣著相機與錄音,去河邊找鬼鼠哥。 笑死熟菲,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的朴恳。 我是一名探鬼主播抄罕,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼于颖!你這毒婦竟也來了呆贿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤森渐,失蹤者是張志新(化名)和其女友劉穎做入,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體章母,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年翩剪,在試婚紗的時候發(fā)現(xiàn)自己被綠了乳怎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡前弯,死狀恐怖蚪缀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情恕出,我是刑警寧澤询枚,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站浙巫,受9級特大地震影響金蜀,放射性物質(zhì)發(fā)生泄漏刷后。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一渊抄、第九天 我趴在偏房一處隱蔽的房頂上張望尝胆。 院中可真熱鬧,春花似錦护桦、人聲如沸含衔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贪染。三九已至,卻和暖如春催享,著一層夾襖步出監(jiān)牢的瞬間杭隙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工睡陪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留寺渗,地道東北人。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓兰迫,卻偏偏與公主長得像信殊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子汁果,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,554評論 2 349

推薦閱讀更多精彩內(nèi)容