亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何理解CLASSPATH

發布時間:2022-01-14 09:22:14 來源:億速云 閱讀:142 作者:iii 欄目:編程語言

這篇文章主要介紹“如何理解CLASSPATH”,在日常操作中,相信很多人在如何理解CLASSPATH問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”如何理解CLASSPATH”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

通過類路徑可以連接 Java 運行庫和文件系統。它告訴編譯器和解釋器應該在何處查找要加載的 .class 文件。它的基本思想是:文件系統的層次結構反映了 Java 包的層次結構,而類路徑則定義了文件系統中的哪個目錄可以作為 Java 包層次結構的根。

遺憾的是,通常文件系統非常復雜并依賴于平臺,而且和 Java 包也不能很好地匹配。尤其是在 Windows 環境中更是如此。Java 是一些 Unix 高手設計的,因而從很多方面來說,這也就意味著它無法很好地與 Windows 約定同步。這樣一來,不論是新用戶還是資深 Java 程序員都深感類路徑的棘手。沒錯,它的確不是 Java 平臺好的一面,它讓您到了下班的時候還在忙于調試一個頑固的小問題。

當然采用 Eclipse 這樣的優秀 IDE 可以減少管理類路徑的一些困難,但只能說是一些,而且前提還必須是一切都正常(但這不大可能,因為總會有一些意外出現)。因此,每個 Java 程序員都必須要全面了解類路徑,惟有如此,才有希望調試類路徑中所出現的問題。

包結構

要掌握類路徑,首先應從其源代碼入手。每個類都屬于一個包,而此包必須 遵守標準的命名約定。簡單地說,包的名稱要由顛倒的兩級域名開始,比如 com.example 或 edu.poly,之后是至少一個或多個單詞用于描述包的內容。比方說,假設有一個域名為 elharo.com,如果要創建一個 Fraction 類,可以將其放入如下包中:

◆com.elharo.math

◆com.elharo.numbers

◆com.elharo.math.algebra.fields

在顛倒的域名之后,需要使用單一單詞的子包名。不要使用縮寫形式,并要保證拼寫正確。如果需要,可以使用拼寫檢查器。大部分與類路徑相關的問題都是由在源代碼中使用某個單詞而在文件系統中使用的卻是與之稍有不同的拼寫或縮寫而引起的。所以最好的做法就是總是使用拼寫正確且沒有縮寫的名稱。

整個包名稱應該是小寫的,即使該名稱是在別處常采取大寫形式的一些慣用名稱和縮寫詞。Windows 通常不區分文件名中的大小寫,但 Java 和一些 UNIX 文件系統卻區分。如果需要在不同的系統間移動文件,大小寫問題肯定會帶來一些麻煩。

包名稱必須要全部由 ASCII 字符組成。一些編譯器也接受用 Hebrew、Cyrillic、Greek 或其他腳本編寫的包名稱,但大多數文件系統并不接受;您稍后就會看到,這樣的包名稱必須擔負充當目錄名這樣的雙重任務。Java 包和類名是 Unicode,但很多文件系統(包括 FAT)卻不能識別 Unicode。遺憾的是,FAT 系統非常之多。如果只簡單地用不同的默認編碼將文件復制到系統將會使編譯器和解釋器無法找到正確的類。

不要試圖在包名稱方面節約成本。長遠來看,這只會有百害而無一利。如果需要域名就買一個。如果名稱太長就買個短些的(我曾經買到了 xom.nu 這樣一個域名,因而我的包前綴就只有 6 個字符)。不要將類放到默認包中(默認包是指如果未在類中包含一條包語句時系統默認給出的包)。如果包訪問不利于對象間的通信,就需要向類中添加更多的公共方法。需要多次使用的類必須要放到包中。

配置 Windows

文件擴展名和路徑對于 Java 和 Windows 來說都很重要。所以在開始下面的步驟之前,務必確保能夠看到它們。隱藏部分文件名對終端用戶來說還可以接受(但我并不完全這么認為),但對于開發人員來說顯然不行。要解決這個問題,需要對 Windows Explorer 的一些默認設置做些更改。

首先在 Windows 桌面打開任意一個文件夾。找到 Tools 菜單,選擇 Folder Options。在隨后打開的對話框中,確認選擇了如下三個選項,如圖 1 所示:

◆“Display the full path in the address bar” 應該選中。

◆“Display the full path in title bar” 應該選中。

◆“Hide file extensions for known file types” 應該清除。

如何理解CLASSPATH

圖 1. Windows Explorer 選項

您可能還想選中 “Show hidden files and folders”,它對您的 Java 作業沒有多大影響,但就我個人而言,我很希望能夠看到所操作的所有內容。選中這些選項可以顯露關于所做事情的更多細節,使您能更輕松地調試所出現的問題。

目錄結構

下一步要做的是組織源文件來匹配包結構。在某處創建一個干凈的空白目錄。本文中,我將其命名為 project。如果將該目錄放到根級別(比如 C:\project)就會更容易一些。也可以將其放到桌面或 Documents and Settings 文件夾。但這會讓輸入的命令更長也更為復雜,所以只在十分必要的情況下才這么做(如果您運行的是 Windows XP 或更高,而且沒有管理員權限,那您沒有什么其他的選擇。在單用戶系統上,最好是要有管理員權限,這會使情況大大簡化)。

無論如何,不要將此目錄(或任何其他目錄)放到 JDK 文件夾(例如 C:\jdk1.6.0 或 C:\Program Files\Java\j2sdk1.5.0_09)。JDK 和 JRE 目錄在初始安裝之后應該保持不動。

在 project 目錄內,另外創建兩個目錄: bin 和 src(一些人更喜歡將其分別命名為 build 和 source)。

接下來,在 src 目錄,建一個與包層次結構相匹配的層次結構。例如,如果給定類名為 com.elharo.math.Fraction,我會將 com 目錄放到 src 目錄中,然后在 com 目錄中創建一個 elharo 目錄,再在 elharo 目錄內放一個 math 目錄,最后在 math 目錄內放上 Fraction.java,如圖 2 所示:

如何理解CLASSPATH

圖 2. 符合包結構的目錄結構

要點:不要在 src 目錄中放置除源代碼之外的任何內容。通常這里放入的文件都是 .java 文件。在有些情況下,也可放置 .html 文件(用于 JavaDoc)或其他類型的源代碼。然而,決不能在此結構內放置 .class 文件或任何其他編譯并生成的工件。這樣做只會帶來麻煩。遺憾的是,如果不夠謹慎,javac 編譯器就會 “明知故犯”。在下一節,將介紹如何修復這一問題。

編譯

編譯 Java 代碼需要一些技巧,原因是必須要跟蹤如下幾方面相關但又有所不同的內容:

◆正在編譯的目標文件。

◆編譯器在其中尋找目標文件導入 .java 文件的那個目錄。

◆編譯器在其中尋找目標文件導入 .class 文件的那個目錄。

◆編譯器在其中放置編譯輸出的目錄。

默認地,javac 編譯器將上述目錄都認為是當前目錄,而這并不是您所希望的。因此,需要在編譯時顯式地指定這些元素。

要編譯的文件

指定的第一個要編譯的文件是 .java 文件,以從當前目錄到該文件的整個路徑的形式給出。比如,假設當前所在目錄是 圖 1 所示的 project 目錄。該目錄包含 src 目錄。此 src 目錄包含 com 目錄,而 com 目錄又包含 example 目錄,example 目錄下是 Fraction.java 文件。如下命令行對它進行編譯:

C:\project> javac src\com\elharo\math\Fraction.java

如果路徑不正確,就會給出這樣的錯誤消息:

error: cannot read: src\com\example\mtah\Fraction.java

如果出現這樣的錯誤消息,就需要檢查路徑的各個部分,確保它們拼寫正確。在本例中,錯誤消息顯示 math 的第二和第三個字母顛倒了。

如果沒有發現拼寫錯誤,請檢查該文件是否處于它應該出現的位置,方法是按如下所示發出一個 dir 命令:

C:\project\src> dir src\com\example\math

ls: src/com/example/math: No such file or directory

出現問題的原因通常是因為路徑拼寫錯誤,但也可能是由于當前的目錄不對。在本例中,需要檢查當前的工作目錄是不是 project 目錄。檢查命令行上 C: 和 > 之間的文本,以確認當前目錄是否是預期的目錄。在本例中,當前目錄為 C:\project\src,而預期的目錄卻是 C:\project。

輸出到何處?

假設沒有出現任何語法錯誤,javac 將編譯后的 .class 文件放到與之對應的.java 文件所在的相同目錄內。這并不是您所想要的結果。將 .class 和 .java 文件混在一起常常會使清理編譯后的文件十分困難,因為很可能會意外刪除本應保留的 .java 文件。這常會使清理構建十分困難,而且還會導致版本問題。發布一個二進制時,只對編譯后的 .class 文件進行歸檔也會十分困難。因此,需要告知編譯器將編譯后的輸出放到一個完全不同的目錄內。-d 開關用來指定輸出目錄(通常稱為 bin、build 或 class):

C:\project> javac -d bin src\com\elharo\math\Fraction.java

這時的輸出將如圖 3 所示。請注意 javac 已經創建了完整的 com\elharo\math 目錄層次結構。不需要手動建立。

如何理解CLASSPATH

圖 3. 并行源和編譯后的層次結構

源路徑

源路徑 就是 Java 在其中尋找源文件的那個目錄。具體到本例,就是 src 目錄。該目錄必須包含源文件的層次結構,這些源文件可以被放到它們自己的目錄中。因此它不是 com 目錄也不是 src\com\elharo\math 目錄。

很多項目都使用不止一個類和包。它們通過導入語句和完整的包限定類名連接起來。例如,假設您在 com.elharo.gui 包中創建了 MainFrame 類,如清單 1 所示:

package com.elharo.gui;  import com.elharo.math.*;  public class MainFrame{      public static void main(String[] args) {          Fraction f = new Fraction();          // ...      }  }

清單 1. 一個包中的類可以導入另一個包中的類

該類使用的是與 MainFrame 類所在的包不同的包中的 com.elharo.math.Fraction 類。源設置現在應該如圖 4 所示(我將編譯后的輸出從之前的步驟中刪除了。但這沒有關系,因為我總是能重新編譯它)。

如何理解CLASSPATH 

圖 4. 幾個包的源結構

現在來看一下試著像以前一樣編譯 MainFrame.java 會出現什么情況。

C:\project> javac -d bin src\com\elharo\gui\MainFrame.java src\com\elharo\gui\MainFrame.java:

3: package com.elharo.math does not exist
import com.elharo.math.*;
^
src\com\elharo\gui\MainFrame.java:7: cannot find symbol
symbol  : class Fraction
location: class com.elharo.gui.MainFrame
  private Fraction f = new Fraction();
          ^
src\com\elharo\gui\MainFrame.java:7: cannot find symbol
symbol  : class Fraction
location: class com.elharo.gui.MainFrame
  private Fraction f = new Fraction();
                           ^
3 errors

出現錯誤的原因是,雖然 javac 知道到何處可以找到 MainFrame.java,但它卻并不知道到何處可以找到 Fraction.java(您可能覺得它應該具備足夠的智能來識別匹配的層次結構,但事實并非如此)。為了給它提供一些線索,必須指定源路徑。用源路徑指定編譯器應該到哪些目錄查找源文件的層次結構。在清單 2 中,源路徑是 src。所以我使用了 -sourcepath 選項,如下所示:

C:\project> javac -d bin -sourcepath src src\com\elharo\gui\MainFrame.java

現在再編譯程序,就不會出現錯誤,并會產生如圖 5 所示的輸出。請注意 javac 也編譯了文件 Fraction.java,Fraction.java 被當前編譯的文件引用。

 如何理解CLASSPATH

圖 5. 多類輸出

編譯源路徑中的多個目錄

在源路徑中可以有多個目錄,使用分號分隔各目錄,但通常沒有必要這么做。例如,若我想包括本地的 src 目錄和用來存放另一個項目的源代碼的 C:\Projects\XOM\src 目錄,我可以這樣進行編譯:

C:\project> javac -d bin -sourcepath src;C:\Projects\XOM\src

src/com/elharo/gui/MainFrame.java

該命令并不編譯在這兩個層次結構中所找到的每個文件。它只編譯由單個的 .java 文件直接或間接引用的文件,而此 .java 文件必須被編譯。

更常見的情況是,為 .java 文件用一個單一的源目錄,為類或放置了預編譯的第三方庫的 JAR 歸檔文件用多個目錄。而這正是類路徑的作用所在。

設置類路徑

在大中型項目中,每次都要對每個文件進行重編譯會非常耗時。為減少這種編譯負擔,可以在不同的 bin 目錄分別編譯和存儲相同項目的獨立部分。這些目錄被添加到類路徑。

將類添加到類路徑有幾種方法可選。但您只能使用 -classpath 命令行開關。例如,假設我想從另一個之前已經編譯到目錄 C:\lib\classes 中的項目導入文件,那么我會向命令行添加 -classpath C:\lib\classes,如下所示:

C:\project> javac -d bin -sourcepath src -classpath C:\lib\classes

src\com\elharo\gui\MainFrame.java

現在假設需要添加兩個目錄:C:\project1\classes 和 C:\project2\classes,可以將它們用分號分開,如下所示:

C:\project> javac -d bin -sourcepath src

-classpath C:\project1\classes;C:\project2\classes

src\com\elharo\gui\MainFrame.java

當然,您也可以使用自己喜歡的各種相對路徑的格式。比如,如果 project1 和 project2 是當前工作目錄的同級目錄(即它們有相同的父目錄),那么我會這樣引用它們:

C:\project> javac -d bin -sourcepath src

-classpath ..\project1\classes;..\project2\classes

src\com\elharo\gui\MainFrame.java

到目前為止,我都一直假設程序完全獨立并且沒有使用任何單獨的編譯后的第三方庫。如果需要使用第三方庫,還必須將它們也添加到類路徑。庫通常是 JAR 文件的格式,比如 junit.jar 或 icu4j.jar。在本例中,需要向類路徑添加的只是 JAR 文件本身,而不是包含 JAR 文件的目錄(從實質上講,JAR 文件可以充當包含編譯后的 .class 文件的一種目錄)。例如,如下命令會向類路徑添加三項內容:目錄 C:\classes、當前工作目錄中的文件 icu4j.jar 以及 E:\lib 中的文件 junit.jar:

C:\project> javac -d bin -sourcepath src

-classpath C:\classes;icu4j.jar;E:\lib\junit.jar

src\com\elharo\gui\MainFrame.java

JAR 文件僅用于 .class 文件和類路徑,不用于 .java 文件和源路徑。

運行程序

現在您已經成功地編譯了程序,可以運行它了。運行與編譯相似但更為簡單一些。當運行程序時,只需指定兩項內容:

◆類路徑

◆包含 main() 方法的類的完全限定包名

無需指定源路徑。

通常這里的類路徑與編譯程序所使用的類路徑相同,只是多了一個放置編譯后的輸出的目錄。例如,如果編譯命令如下所示:

C:\project> javac -d bin -sourcepath src

-classpath C:\classes;E:\lib\junit.jar

src\com\elharo\gui\MainFrame.java

并且 main() 方法在類 com.elharo.gui.Mainframe.java 內,就可以像這樣運行此程序:

C:\project> java -classpath C:\classes;E:\lib\junit.jar

com.elharo.gui.MainFrame

請務必注意命令行的最后一項是類名。它不是一個文件名,也不是 .java 或 .class。該類必須能夠在類路徑的某處找到。

可能存在類的其他地方

我強烈建議您在編譯和運行時總是顯式地指定類路徑。也可以將文件放到其他地方,以便它們可以被添加到類路徑中,并被 javac 編譯器和 java 解釋器找到。這種做法會節省一些鍵入操作,但當(注意不是如果)您無意間將一個舊版本的類放到類路徑中時,這卻會耗費大量的調試時間。

在本節,將展示類常常隱匿其中的幾個地點,這些類很可能會出乎意料地冒到類路徑中并導致問題的出現。在不受您控制的機器上(比如服務器),這更為多見。

當前工作目錄

編譯器總是將當前工作目錄 (.) 添加到類路徑,而不管您是否曾顯式地要求這樣做。您很容易忘記在和您所在的目錄相同的目錄中有和沒有的內容。因此,請盡量避免將任何類或層次結構放入 project 或 home 目錄。相反地,應該將 .java 文件和 .class 文件分別放入 src 目錄和 bin 目錄。

CLASSPATH

過一會,您就會發現向類路徑手工添加 bin 目錄和 JAR 歸檔文件太過繁瑣。這時您可能會想要使用 CLASSPATH 環境變量。可以只向 CLASSPATH 環境變量添加一次目錄和 JAR 歸檔文件,之后就不需要在每次運行 javac 或 java 時都要再鍵入這些路徑。

請務必抵制這種誘惑。這樣做,一旦加載了錯誤的類或錯誤版本的類,就會出問題。而且意外加載錯誤的類所帶來的調試時間常常會百倍于省下的那點鍵入時間。要避免輸入并自動處理類路徑有更好的方法。

jre\lib\ext

放在 jre\lib\ext 目錄中的 JAR 歸檔文件會被添加到通過虛擬機運行的所有應用程序的類路徑。這看起來很方便,實際上它與向 CLASSPATH 環境變量添加目錄一樣,存在長遠的潛在問題。您遲早(通常很快)會在您想都想不到的地方加載類的一個錯誤版本的類并會為此付出大量的調試時間。

部署一個服務器端的應用程序時,問題就更為嚴峻。請確保部署到的服務器在其 jre\lib\ext 目錄沒有任何額外的 JAR。如果您不熟悉錯誤癥狀,也不知道該如何查找,那么由類路徑中的錯誤版本的 JAV 歸檔文件所帶來的問題可能會非常難于調試。為了避免這些問題的出現,一些框架甚至編寫了自己的類加載器,用來繞過 Java 代碼通常的類加載機制。

jre\lib\endorsed

放在 jre\lib\endorsed 目錄中的 JAR 文件也被添加到了通過虛擬機運行的所有應用程序的類路徑。不同的是,這里的文件被實際放入了 bootclasspath 而不是通常的類路徑,并可以代替 JDK 附帶的標準類。這種方式對于在 VM 更新 XML 解析器和修復 bug 尤其有用。

但是,如前所述,這種方法看起來十分方便,但實際上也存在長期的潛在問題,原因也一樣。如果需要替換 JDK 類,可以在運行時使用 -Xbootclasspath/p 選項來避免意外地加載錯誤版本的類。

C:\project> java -classpath C:\classes
-Xbootclasspath/p:xercesImpl.jar com.elharo.gui.MainFrame

自動管理類路徑

在想要使用電動射釘槍之前要先熟練使用錘子,與此相似,在試圖采用更強大的自動管理工具之前也要先能自如地手動管理這些類。如果您掌握了命令行工具集,就可以使用另外的工具來自動處理源路徑和類路徑所需的一些繁瑣過程。這些工具大部分也需要您像本文所介紹的那樣組織文件。

IDE

像 Eclipse 和 NetBeansMost 這樣的許多開發環境都能協助類路徑的自動管理。例如,當更改包的名稱時,Eclipse 能相應地移動對應的 .java 文件,如圖 6 所示:

如何理解CLASSPATH 

圖 6. 在 Eclipse 中快速修復類路徑

請記住,這些 IDE 位于文件系統的頂部,必須正確設置,尤其是當需要與其他工具和其他 IDE 集成時就更應如此。這些工具最大的貢獻是用 GUI 對話框、樹視圖和選項卡代替了命令行開關參數,但其基本的文件結構還是一樣的。

Ant

Ant 是自動化構建過程的事實上的標準工具。與將目錄放在 jre\lib\ext 或 CLASSPATH 環境變量的做法不同,Ant 真的可以讓您創建單步的構建過程。但您仍然需要在 Ant build.xml 設置類路徑并手動將源文件放到正確的目錄。但至少現在您無需在每次編譯都要重新進行指定。

Maven

Maven 在組織和自動化構建過程方面比 Ant 還要更進一步。Maven 提供一個合理的默認設置讓您可以通過添加少許幾行代碼并將源文件放到 Maven 能夠找到的位置即可構建簡單的項目。您仍然需要調整文件系統和包的層次結構。Maven 在管理第三方庫的依賴性方面也有上佳的表現,雖然它不如 Ant 那么易于定制。

到此,關于“如何理解CLASSPATH”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

娱乐| 读书| 东源县| 聊城市| 龙泉市| 蚌埠市| 朝阳县| 石林| 民乐县| 济宁市| 凤山县| 西充县| 临海市| 错那县| 合肥市| 玉溪市| 怀柔区| 桃园市| 临夏县| 鹿邑县| 屏山县| 三原县| 卓尼县| 广平县| 康平县| 上饶县| 无为县| 麻城市| 奈曼旗| 大厂| 武山县| 屏东县| 大同县| 渭源县| 修文县| 奉节县| 揭阳市| 德钦县| 蚌埠市| 阿克陶县| 南靖县|