2017年11月11日 星期六

Javac編譯搜尋class

當cmd出現錯誤:找不到或無法載入主要類別時,可能是指令輸入錯誤,以下為觀念解說:

  • 注意編譯的檔案是否有使用到其他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:.,則搜尋順序如下
    1. 第一個使用者自行設定的路徑,從左至右第一個是path1
    2. 第二個是path2 
    3. 第三個是(.)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目錄的上一層,才能找得到foo.A.class)
  • class搜尋的路徑寫了(.)dot,代表在當前目錄(test)下能夠找到foo.A.class
  • 編譯的檔案名需為(foo/B.java),因為是在test中的相對路徑下才找得到B.java
結論:
  1. 先考慮要編譯的class相關class完整名稱,Javac指令 default是目前目錄,Java指令default是$CLASSPATH
  2. 再考慮要編譯的java檔案位置是否在default目錄,否則需要加再-classpath options中

沒有留言:

張貼留言