1. 程式人生 > >很奇怪的bootclasspath引數 同文章裡說的一樣,也沒有搞清楚 為什麼需要顯式地指定一下-bootclasspath

很奇怪的bootclasspath引數 同文章裡說的一樣,也沒有搞清楚 為什麼需要顯式地指定一下-bootclasspath

http://blog.csdn.net/smilingleo/article/details/5005538

嘗試下面程式碼:

  1. import sun.util.resources.LocaleData;  
  2. publicclass SunTest{  
  3.     public SunTest(){  
  4.     }  
  5. }  

編譯時報錯:

  1. C:/Temp>javac -verbose SunTest.java  
  2. [解析開始時間 SunTest.java]  
  3. [解析已完成時間 63ms]  
  4. [原始檔的搜尋路徑: .]  
  5. [類檔案的搜尋路徑: C:/Java/jdk1.6/jre/lib/resources.jar,C:/Java/jdk1.
    6/jre/lib/  
  6. rt.jar,C:/Java/jdk1.6/jre/lib/sunrsasign.jar,C:/Java/jdk1.6/jre/lib/jsse.jar,C:/  
  7. Java/jdk1.6/jre/lib/jce.jar,C:/Java/jdk1.6/jre/lib/charsets.jar,C:/Java/jdk1.6/j  
  8. re/classes,C:/Java/jdk1.6/jre/lib/ext/dnsns.jar,C:/Java/jdk1.6/jre/lib/ext/local  
  9. edata.jar,C:/Java/jdk1.6/jre/lib/ext/sunjce_provider.jar,C:/Java/jdk1.6/jre/lib/  
  10. ext/sunmscapi.jar,C:/Java/jdk1.6
    /jre/lib/ext/sunpkcs11.jar,.]  
  11. SunTest.java:1: 找不到符號  
  12. 符號: 類 LocaleData  
  13. 位置: 軟體包 sun.util.resources  
  14. import sun.util.resources.LocaleData;  
  15.                          ^  
  16. [正在裝入 java/lang/Object.class(java/lang:Object.class)]  
  17. [正在檢查 SunTest]  
  18. [總時間 187ms]  
  19. 1 錯誤  

新增javac編譯引數,指定bootclasspath,編譯錯誤消失:

  1. C:/Temp>javac -bootclasspath C:/Java/jdk1.
    6/jre/lib/rt.jar -verbose SunTest.java  
  2. [解析開始時間 SunTest.java]  
  3. [解析已完成時間 15ms]  
  4. [原始檔的搜尋路徑: .]  
  5. [類檔案的搜尋路徑: C:/Java/jdk1.6/jre/lib/rt.jar,C:/Java/jdk1.6/jre/lib/ext/dns  
  6. ns.jar,C:/Java/jdk1.6/jre/lib/ext/localedata.jar,C:/Java/jdk1.6/jre/lib/ext/sunj  
  7. ce_provider.jar,C:/Java/jdk1.6/jre/lib/ext/sunmscapi.jar,C:/Java/jdk1.6/jre/lib/  
  8. ext/sunpkcs11.jar,.]  
  9. [正在裝入 sun/util/resources/LocaleData.class(sun/util/resources:LocaleData.clas  
  10. s)]  
  11. [正在裝入 java/lang/Object.class(java/lang:Object.class)]  
  12. [正在檢查 SunTest]  
  13. [已寫入 SunTest.class]  
  14. [總時間 192ms]  

編譯錯誤問題的原因是bootClassLoader沒有找到sun.util.resources.LocaleData這個類,從sun的文件中得知,sun不鼓勵開發人員直接使用sun.*裡面的程式碼,主要的原因是sun.*裡面的程式碼就是實現jvm的底層程式碼,是平臺相關的,而且相關實現隨著版本升級隨時可能會被替換,程式碼的穩定性、一致性等等都存在問題。

但是這並不是問題的關鍵。從verbose資訊中可以看出,兩次編譯過程中搜索路徑(classpath)中都包含rt.jar,但是為什麼顯式地指定一下-bootclasspath之後就會讓bootclassloader載入sun.*呢?

沒有找到答案,可能只有得到sun sdk的原始碼才能發現問題的原因。

這個討論比較有價值:http://forums.sun.com/thread.jspa?threadID=5356024&start=0