1. 程式人生 > >java入門---環境設定以及執行例項之如何執行指定class檔案目錄(classpath)

java入門---環境設定以及執行例項之如何執行指定class檔案目錄(classpath)

    如果我們 Java 編譯後的class檔案不在當前目錄,我們可以使用 -classpath 來指定class檔案目錄:

C:> java -classpath C:\java\DemoClasses HelloWorld

    以上命令中我們使用了 -classpath 引數指定了 HelloWorld 的 class 檔案所在目錄。如果class檔案在jar檔案中,則命令如下:

c:> java -classpath C:\java\myclasses.jar

    我們來詳細看下javac -classpath的使用javac: 如果當前你要編譯的 java 檔案中引用了其它的類(比如說:繼承),但該引用類的 .class 檔案不在當前目錄下,這種情況下就需要在 javac 命令後面加上 -classpath 引數,通過使用以下三種類型的方法 來指導編譯器在編譯的時候去指定的路徑下查詢引用類。

  • (1).絕對路徑:javac -classpath c:/junit3.8.1/junit.jar Xxx.java
  • (2).相對路徑:javac -classpath ../junit3.8.1/Junit.javr Xxx.java
  • (3).系統變數:javac -classpath %CLASSPATH% Xxx.java (注意:%CLASSPATH%表示使用系統變數CLASSPATH的值進行查詢,這裡假設Junit.jar的路徑就包含在CLASSPATH系統變數中)

    再來看javac 絕對路徑的使用。javac:假設你要編譯的類檔名叫:HelloWorld.java,其完全路徑為:D:/java/HelloWorld.java。但你所在的當前目錄是:C:/Documents and Settings/peng>。如果想在這裡執行編譯,會有什麼結果呢?

    首先第一點,C:/Documents and Settings/peng> javac HelloWorld.java 這時編譯器會給出如下的錯誤提示資訊:

error: cannot read:HelloWorld.java

    這是因為預設情況下 javac 是在當前目錄下查詢類檔案,很明顯這個路徑不是我們存放類檔案的地方,所以就會報錯了。

    第二點,C:/Documents and Settings/peng> javac D:/java/HelloWorld.java 這時編譯成功。所以,只要你執行 javac 命令的目錄不是類檔案存放的目錄,你就必須在 javac 命令中顯式地指定類檔案的路徑。

    再來看java -classpath 的使用。java:假設我們的 CLASSPATH 設定為:D:/peng/java/pro ,在該目錄下有三個檔案:HelloWorld.java / HelloWorldExtendsTestCase / HelloWorldExtendsHelloWorld。這三個檔案的類宣告分別如下:

HelloWorld.java publicclassHelloWorldHelloWorldExtendsHelloWorld.java publicclassHelloWorldExtendsHelloWorldextendsHelloWorldHelloWorldExtendsTestCase.javapublicclassHelloWorldExtendsTestCaseextends junit.framework.TestCase

    假設我們已經按照上面關於 javac -classpathjavac 絕對路徑的使用,順利地完成了三個檔案地編譯。現在我們在 C:/Documents and Settings/peng> 目錄下執行這三個 .class 檔案:

C:/Documents and Settings/peng>java  HelloWorldHelloWorld

    可以看到執行成功。為什麼我們在 C:/Documents and Settings/peng> 執行命令,JVM 能夠找到D:/peng/java/pro/HelloWorld.class檔案呢?這是因為我們配置了系統變數 CLASSPATH,並且指向了目錄:D:/peng/java/pro 。所以 JVM 會預設去該目錄下載入類檔案,而不需要指定 .class 檔案的絕對路徑了。

C:/Documents and Settings/peng>java HelloWorldExtendsHelloWorldHelloWorld

    可以看到執行成功了。HelloWorldExtendsHelloWorld 繼承了 HelloWorld 類,所以在執行時JVM會先查詢在 CLASSPATH 下是否存在一個HelloWorld.class 檔案,因為我們已經成功編譯了 HelloWorld 類了,所以可以成功執行 HelloWorldExtendsHelloWorld.class:

C:/Documents and Settings/peng>java HelloWorldExtendsTestCaseExceptionin thread "main" java.lang.NoClassDefFoundError: junit/framework/TestCase

    可以看到程式丟擲異常了,提示找不到 junit.framework.TestCase檔案。為什麼同樣在 /peng/java/pro 下,HelloWorldExtendsHelloWorld.class 就可以成功執行,而這個就不行了呢?這是因為:junit.framework.TestCase.class 檔案並不存在於當前目錄下,所以為了能夠讓程式成功執行,我們必須通過指定 CLASSPATH 的方式,讓 JVM 可以找到 junit.framework.TestCase這個類,如下:

C:/Documents and Settings/peng>java -classpath %CLASSPATH%HelloWorldExtendsTestCaseHelloWorld

    通過上面的瞭解,我們可以做出如下總結:

  • (1).何時需要使用 -classpath:當你要編譯或執行的類引用了其它的類,但被引用類的 .class 檔案不在當前目錄下時,就需要通過 -classpath 來引入類
  • (2).何時需要指定路徑:當你要編譯的類所在的目錄和你執行 javac 命令的目錄不是同一個目錄時,就需要指定原始檔的路徑(CLASSPATH 是用來指定 .class 路徑的,不是用來指定 .java 檔案的路徑的)
    好啦,本次記錄就到這裡了。如果感覺不錯的話,請多多點贊支援哦。。。