1. 程式人生 > >path和classpath細節

path和classpath細節

學習 b- jdk 運行 work 很多 java源代碼 其中 其他

  從學習java的最初我們就被要求先設置path變量和classpath變量。但是這兩個環境變量到底有什麽作用呢?

  1.path環境變量

  path環境變量的主要作用是告訴操作系統到哪裏去尋找某個程序,如果操作系統在當前目錄下找不到我們想要執行的程序,就會順著path環境變量指定的目錄去查找。最簡單的一個例子,我們安裝完jdk以後需要給它設置path變量。一般情況下是這樣設置%JAVA_HOME%\bin;其中JAVA_HOME的值是:C:\Program Files\Java\jdk1.8.0_131。其實設置這個path,就是為了告訴系統,要去%JAVA_HOME%\bin這個地方尋找javac.exe,java.exe這兩個程序。然後才能運行這兩個程序。這就是path環境變量的作用。

  2.javac.exe和java.exe。

  這兩個是java最主要的程序,javac.exe是編譯器,用於將java源代碼轉化為.class文件;java.exe是解釋器。運行javax.exe將源代碼轉換為.class文件,運行java.exe則將.class文件解釋執行。這是由java虛擬機(JVM)來完成的。jvm解釋執行類的過程比較復雜。包含載入類,校驗,運行等。以後有相應的文章整理。

  3.classpath環境變量。

  classpath變量是告訴JVM到哪裏去尋找一個類。也就是在執行java xxxx這個命令的時候去哪裏尋找xxxx這個類。記得我們最初安裝jdk的時候,同樣設置了classpath環境變量,我們設置的值是.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar ,設置這個值的目的是為了告訴JVM,到這個目錄下去尋找類。

  首先.;這個目錄指的是當前目錄,即告訴jvm首先到當前目錄去尋找類。

  如果當前目錄找不到,就去%JAVA_HOME%\lib中尋找,還是找不到,就去%JAVA_HOME%\lib\tools.jar尋找。我們在編寫程序的時候用到很多jdk的類都需要到lib和tool.jar這兩個地方尋找。只有設置了classpath變量,我們才能找到並運行相關的jdk類。

  舉例來說:

  我們再D:/javawork下新建了一個test.java的類,首先,我們要用命令提示符將當前目錄定位到D:/javawork下,然後執行javac test.java。此時在D:/javawork文件夾下面就會出現test.class這個文件。接下來我們再D:/javawork下執行java test。因為我們在classpath中設置了.;這個環境變量,jvm就會到當前目錄,也就是D:/javawork去尋找test這個類,找到並執行它的代碼。

  假如找不到,他就得到classpath中設置的其他路徑去尋找了。

  總之,要運行(載入)一個類,必須到classpath下面去找到它,而classpath是我們可以設置的。

  對於具有包名的類,classpath又是如何工作的呢?

  假如我寫了一個類,它是屬於某個包,比如com.xdx.learn。則這個類的全稱叫做com.xdx.learn.test。假設這個test.java文件我們目前放在D:/javawork下,此時如果我們采用javac test.java這個命令編譯它,還是會在D:/javawork下生產一個test.class文件。

  運行java test。失敗,提示找不到test類。

  這是因為此時類要加上全限定名,即com.xdx.learn.test.

  那麽運行java com.xdx.learn.test。依然出錯,還是找不到com.xdx.learn.test。

  正確的做法是,我們依次新建com文件夾,在com文件夾下建xdx文件夾,在xdx文件夾下建立learn文件夾,然後再把test.class這個文件放入learn文件夾下。執行ava com.xdx.learn.test。此時才是成功的。

  jvm在裝載帶有包名的類的時候,會從classpath中找到路徑(本例是當前目錄,即D:/javawork),然後去尋找頂層包名所對應的的物理目錄(本例是com文件夾),然後按照包名的順序依次尋找對應的目錄,在最底層包名中找到test.calss文件。所以classpath的設置一定要指向頂級包名所對應的目錄(com文件夾)的父目錄(D:/javawork)。而非指向test.calss所在的目錄。這一點至關重要。

  ps:其實有個小竅門,我們在編譯的時候就可以生成包名所對應的的物理目錄,只要使用如下命令。javac -d . test.java。就可以生成與包名對應的物理目錄。

  4.import

  import是引入包中的類,比如我們想要用到某個類,但是這個類跟當前的類不在同一個包中,我們就需要使用import關鍵字。

  需要知道的是,你要引入某個類,即使用import去引入,它必須已經被jvm所裝載。我們在編寫web項目的時候,總是引用很多外部的jar包,有jdk的,有tomcat目錄下的,還有web-inf/lib下的。所以我們該知道,在裝載我們自己編寫的類之前,jvm首先要裝載這三個地方的類。否則import就不會起作用了。

  

  

path和classpath細節