2007 年 1 月 04 日
類路徑是 java™ 平臺中最復雜也最令人頭痛的部分之一,但熟練把握類路徑對成為一名專業 Java 程序員來說卻又十分要害。![]()
![]()
![]()
![]()
![]()
![]()
![]()
在本文中,Elliotte Rusty Harold 為您闡述了類路徑和源路徑的復雜性,并向您展示了如何在 UNIX 和 Mac OS X 中熟練把握它們。假如您使用的是 Windows,請參閱本文的 姊妹篇。
類路徑可以連接 Java 運行庫和文件系統。它定義編譯器和解釋器應該在何處查找要加載的 .class 文件。它的基本思想是:文件系統的層次結構反映了 Java 包的層次結構,而類路徑則定義了文件系統中的哪個目錄可以作為 Java 包層次結構的根。
遺憾的是,通常文件系統非常復雜并依靠于平臺,而且和 Java 包也不能很好地匹配。這樣一來,不論是新用戶還是資深 Java 程序員都深感類路徑的棘手。沒錯,它的確不是 Java 平臺好的一面,它讓您到了下班的時候還在忙于調試一個頑固的小問題。
當然采用 Eclipse 這樣的優秀 IDE 可以減少治理類路徑的一些困難,但只能說是一些,而且前提還必須是一切都正常(但這不大可能,因為總會有一些意外出現)。因此,每個 Java 程序員都必須要全面了解類路徑,惟有如此,才有希望調試類路徑中所出現的問題。
在本文中,我給出了您所需要了解的有關 UNIX、linux 和 Mac OS X 中的 Java 類路徑(以及相關源路徑)的全部內容。本文的 姊妹篇 則展示了 Windows 上的類似技術。文中列出的步驟可以作為指南,并能解決出現的大多數問題。
包結構
要把握類路徑,首先應從其源代碼入手。每個類都屬于一個包,而此包必須 遵守標準的命名約定。簡單地說,包的名稱要由顛倒的兩級域名開始,比如 com.example 或 edu.poly,之后是至少一個或多個單詞用于描述包的內容。比方說,假設有一個域名為 elharo.com,假如要創建一個 Fraction 類,可以將其放入如下包中:
在顛倒的域名之后,需要使用單一單詞的子包名。不要使用縮寫形式,并要保證拼寫正確。假如需要,可以使用拼寫檢查器。大部分與類路徑相關的問題都是由在源代碼中使用某個單詞而在文件系統中使用的卻是與之稍有不同的拼寫或縮寫而引起的。所以最好的做法就是總是使用拼寫正確且沒有縮寫的名稱。
整個包名稱應該是小寫的,即使該名稱是在別處常采取大寫形式的一些慣用名稱和縮寫詞。Windows 通常不區分文件名中的大小寫,但 Java 和一些 UNIX 文件系統卻區分。假如需要在不同的系統間移動文件,大小寫問題肯定會帶來一些麻煩。包名稱必須要全部由 ASCII 字符組成。一些編譯器也接受用 Hebrew、Cyrillic、Greek 或其他腳本編寫的包名稱,但大多數文件系統并不接受;您稍后就會看到,這樣的包名稱必須擔負充當目錄名這樣的雙重任務。Java 包和類名是 Unicode,但很多文件系統(包括 FAT)卻不能識別 Unicode。遺憾的是,FAT 系統非常之多。假如只簡單地用不同的默認編碼將文件復制到系統將會使編譯器和解釋器無法找到正確的類。
假如您在編寫一個只使用一次就丟掉的類 —— 比如測試一個 API 的類 —— 則無需將它放到包中。但需要多次使用的類必須要放到包中。
不要試圖在包名稱方面節約成本。長遠來看,這只會有百害而無一利。假如需要域名就買一個。假如名稱太長就買個短些的(我曾經買到了 xom.nu 這樣一個域名,因而我的包前綴就只有 6 個字符)。不要將類放到默認包中(默認包是指假如未在類中包含一條包語句時系統默認給出的包)。假如包訪問不利于對象間的通信,就需要向類中添加更多的公共方法。需要多次使用的類必須要放到包中。
目錄結構
下一步要做的是組織源文件來匹配包結構。在某處創建一個干凈的空白目錄。本文中,我將其命名為 PRoject。在這個目錄里,再創建兩個目錄:bin 和 src。(有些人更喜歡將其分別命名為 build 和 source。)
接下來,在 src 目錄,建一個與包層次結構相匹配的層次結構。例如,假如給定類名為 com.elharo.math.Fraction,我會將 com 目錄放到 src 目錄中,然后在 com 目錄中創建一個 elharo 目錄,再在 elharo 目錄內放一個 math 目錄,最后在 math 目錄內放上 Fraction.java,如圖 1 所示:
新聞熱點
疑難解答