1. 程式人生 > 實用技巧 >Java(21)classpath和jar包

Java(21)classpath和jar包

classpath和jar包

classpath(很少設定,一般預設)

classpathJVM用到的一個環境變數,它用來指示JVM如何搜尋class。所以,classpath就是一組目錄的集合,它設定的搜尋路徑與作業系統相關

在windows系統中,可能長這樣,分隔符為";"

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

在Linux系統中,可能長這樣,分隔符為":"

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

強烈不推薦在系統環境變數中設定classpath,那樣會汙染整個系統環境。在啟動JVM時設定classpath才是推薦的做法。實際上就是給java命令傳入-classpath-cp引數:

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

或者使用-cp的簡寫:

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

.代表當前目錄。如果JVM在某個路徑下找到了對應的class檔案,就不再往後繼續搜尋。如果所有路徑下都沒有找到,就報錯。

沒有設定系統環境變數,也沒有傳入-cp

引數,那麼JVM預設的classpath.,即當前目錄:

java abc.xyz.Hello

不要把任何Java核心庫新增到classpath中!JVM根本不依賴classpath載入核心庫!

更好的做法是,不要設定classpath!預設的當前目錄.對於絕大多數情況都夠用了

jar包

如果一個專案有很多個.class檔案,且存放在不同的目錄下,管理起來很不方便,如果能夠將眾多目錄打包成一個檔案,就方便多了,如下圖:

jar包實際上是一個zip格式的壓縮檔案,相當於windows系統裡普通的檔案打包。如果將jar包字尾名改為.zip,則可在windows裡檢視jar的內容。

jar包 包含一個特殊的/META-INF/MANIFEST.MF

檔案,MANIFEST.MF是純文字,可以指定Main-Class和其它資訊。JVM會自動讀取這個MANIFEST.MF檔案,如果存在Main-Class,我們就不必在命令列指定啟動的類名,而是用更方便的命令,如下:

java -jar hello.jar //沒有指定啟動的類,因為存在Main-Class

在大型專案中,不可能手動編寫MANIFEST.MF檔案,再手動建立zip包。Java社群提供了大量的開源構建工具,例如Maven,可以非常方便地建立jar包。