- 注意編譯的檔案是否有使用到其他class,若有,則需要在classpath加上class完整名稱(full qualified name),一旦一個class被加入套件,class名稱就會是package+class名稱,他們是不可分割的,指令中也不能夠切開。(ex: 假設MyClass是com.foo的member,則class全名為com.foo.Myclass,不可分開 )
- javac若要編譯.java檔,預設是搜尋目前目錄搜尋該.java檔案。
- javac指令是用來呼叫編譯器編譯java檔案,而java為執行java檔案
- javac及java搜尋class時,若在提示字元輸入javac -classpath path1:path2:.,則搜尋順序如下
- 第一個使用者自行設定的路徑,從左至右第一個是path1
- 第二個是path2
- 第三個是(.)dot,此為當前目錄
- 註:在環境設定內的$CLASSPATH路徑會因為使用者有自訂而被替換掉。
- 註2: 以上的目錄+ class完整名稱(package+class))就是要找的class位置
- classpath正名應為”class搜尋的路徑,且其路徑為class的目錄清單“
有了上述的了解,以下例子加以說明:
假設有兩個檔案(A.class, B.java),皆為foo package,其檔案位置如下
test
|
foo
|
A.class
B.java
且foo/B.java繼承foo/A.java,因此在編譯B.java時需要使用到foo.A class
呼叫方法為:javac -classpath . foo/B.java
test
|
foo
|
A.class
B.java
且foo/B.java繼承foo/A.java,因此在編譯B.java時需要使用到foo.A class
呼叫方法為:javac -classpath . foo/B.java
- 必須在在test檔案夾中 (必須為foo目錄的上一層,才能找得到foo.A.class)
- class搜尋的路徑寫了(.)dot,代表在當前目錄(test)下能夠找到foo.A.class
- 編譯的檔案名需為(foo/B.java),因為是在test中的相對路徑下才找得到B.java
結論:
- 先考慮要編譯的class相關class完整名稱,Javac指令 default是目前目錄,Java指令default是$CLASSPATH
- 再考慮要編譯的java檔案位置是否在default目錄,否則需要加再-classpath options中
沒有留言:
張貼留言