先看下定義:
-
-classpath 類路徑
設(shè)置用戶類路徑辛辨,它將覆蓋 CLASSPATH 環(huán)境變量中的用戶類路徑。若既未指定 CLASSPATH 又未指定 -classpath励背,則用戶類路徑由當(dāng)前目錄構(gòu)成春霍。有關(guān)詳細信息,請參閱設(shè)置類路徑叶眉。若未指定 -sourcepath 選項址儒,則將在用戶類路徑中查找類文件和源文件芹枷。
-
-sourcepath 源路徑
指定用以查找類或接口定義的源代碼路徑。與用戶類路徑一樣莲趣,源路徑項用分號 (:) 進行分隔鸳慈,它們可以是目錄、JAR 歸檔文件或 ZIP 歸檔文件喧伞。如果使用包走芋,那么目錄或歸檔文件中的本地路徑名必須反映包名。注意:通過類路徑查找的類潘鲫,如果找到了其源文件翁逞,則可能會自動被重新編譯。
這里-classpath和-sourcepath指定的都是被編譯的源文件需要調(diào)用另外的用戶自定義類或源文件的位置溉仑。
可以理解為
- -classpath用來指定搜索類文件(*.class文件)的路徑挖函,-sourcepath用來指定搜索源文件(*.java文件)的路徑
- 如果未指定-sourcepath,那邊將會在classpath指定的路徑中查找類文件(*.class文件)和源文件(*.java文件)
- 如果找到了源文件(*.java文件)浊竟,可能會重新生成類文件(*.class文件)
下面我們來驗證下第一點(同時指定-classpath和-sourcepath參數(shù)):
新建一個HelloWorld.java文件
package a.b;
public class HelloWorld{
public static void main(String[] args){
System.out.println("Hello World!");
}
}
在命令行執(zhí)行
$ javac -verbose -classpath ~ -sourcepath ~/Downloads HelloWorld.java
-verbose參數(shù)可以幫我們輸出詳細的編譯信息挪圾,在命令中我們指定classpath為,sourcepath為/Downloads逐沙。
如上圖可以看到:類文件的搜索路徑包含/User/gaozengrong,源文件的搜索路徑為/User/gaozengrong/Downloads,就如我們再命令中指定的一樣(“~”符號在linux和mac等系統(tǒng)中代表用戶目錄)哲思。
驗證第二點(只指定-classpath文件)
在命令行直接執(zhí)行
$ javac -verbose -classpath ~ HelloWorld.java
顯而易見,類文件的搜索路徑和源文件的搜索路徑均為/User/gaozengrong
驗證第三點(源文件是否會被重新編譯)
我們新建兩個源文件分別如下:
package a.b;
import c.d.T;
public class TestT {
public static void main(String[] args) {
T t = new T();
t.p();
}
}
package c.d;
public class T {
public void p(){
System.out.println("class:T");
}
}
目錄結(jié)構(gòu)為:
在用戶目錄下編譯TestT.java文件,
javac -verbose -classpath src -sourcepath src src/a/b/TestT.java
如箭頭所指吩案,由于TestT類中引用了T類棚赔,在編譯過程中會加載T.java文件并解析編譯。(至于為何先生成TestT.class文件再生成T.class文件徘郭,我猜測是T.java文件解析完成后靠益,就可以直接編譯生成TestT.class文件)
我們再運行一次編譯命令
javac -verbose -classpath src -sourcepath src src/a/b/TestT.java
此時由于已經(jīng)存在T.class類文件,編譯的時候直接加載了T.class文件残揉,而沒有加載T.java文件再重新進行自動編譯胧后。
我們對T.java文件稍加修改,只添加一條注釋即可抱环,修改后的T.java文件為
package c.d;
public class T {
public void p(){
//稍加修改
System.out.println("class:T");
}
}
此時的src文件夾的目錄結(jié)構(gòu):
我們再運行一次編譯命令
javac -verbose -classpath src -sourcepath src src/a/b/TestT.java
可以看到壳快,T.java文件被重新加載并進行了編譯。
可以得出結(jié)論:源文件是否被重新自動編譯取決于源文件是否已被修改镇草。