1漏设、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,當JVM在加載abc.xyz.Hello這個類時褂傀,會依次查找:
1.<當前目錄>\abc\xyz\Hello.class
2.C:\work\project1\bin\abc\xyz\Hello.class
3.C:\shared\abc\xyz\Hello.class
注意到.代表當前目錄忍啤。如果JVM在某個路徑下找到了對應(yīng)的class文件,就不再往后繼續(xù)搜索仙辟。如果所有路徑下都沒有找到同波,就報錯。
classpath的設(shè)定方法有兩種:
1.在系統(tǒng)環(huán)境變量中設(shè)置classpath環(huán)境變量叠国,不推薦未檩;
2.在啟動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默認的classpath為.香追,即當前目錄:
注意:不要把任何Java核心庫添加到classpath中合瓢!JVM根本不依賴classpath加載核心庫!
java abc.xyz.Hello
上述命令告訴JVM只在當前目錄搜索Hello.class透典。
2晴楔、jar包
如果有很多.class文件,散落在各層目錄中峭咒,肯定不便于管理税弃。如果能把目錄打一個包,變成一個文件凑队,就方便多了则果。
jar包就是用來干這個事的,它可以把package組織的目錄層級顽决,以及各個目錄下的所有文件(包括.class文件和其他文件)都打成一個jar文件短条,這樣一來,無論是備份才菠,還是發(fā)給客戶茸时,就簡單多了
jar包實際上就是一個zip格式的壓縮文件,而jar包相當于目錄赋访。如果我們要執(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)建成功鹦付。
這里需要特別注意的是尚粘,jar包里的第一層目錄,不能是bin敲长,而應(yīng)該是hong郎嫁、ming、mr
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é)
1.JVM通過環(huán)境變量classpath決定搜索class的路徑和順序哆窿;
2.不推薦設(shè)置系統(tǒng)環(huán)境變量classpath,始終建議通過-cp命令傳入厉斟;
3.jar包相當于目錄挚躯,可以包含很多.class文件,方便下載和使用擦秽;
4.MANIFEST.MF文件可以提供jar包的信息码荔,如Main-Class漩勤,這樣可以直接運行jar包。