很奇怪的bootclasspath引數 同文章裡說的一樣,也沒有搞清楚 為什麼需要顯式地指定一下-bootclasspath
阿新 • • 發佈:2019-01-27
http://blog.csdn.net/smilingleo/article/details/5005538
嘗試下面程式碼:
- import sun.util.resources.LocaleData;
- publicclass SunTest{
- public SunTest(){
- }
- }
編譯時報錯:
- C:/Temp>javac -verbose SunTest.java
- [解析開始時間 SunTest.java]
- [解析已完成時間 63ms]
- [原始檔的搜尋路徑: .]
-
[類檔案的搜尋路徑: C:/Java/jdk1.6/jre/lib/resources.jar,C:/Java/jdk1.
- rt.jar,C:/Java/jdk1.6/jre/lib/sunrsasign.jar,C:/Java/jdk1.6/jre/lib/jsse.jar,C:/
- Java/jdk1.6/jre/lib/jce.jar,C:/Java/jdk1.6/jre/lib/charsets.jar,C:/Java/jdk1.6/j
- re/classes,C:/Java/jdk1.6/jre/lib/ext/dnsns.jar,C:/Java/jdk1.6/jre/lib/ext/local
- edata.jar,C:/Java/jdk1.6/jre/lib/ext/sunjce_provider.jar,C:/Java/jdk1.6/jre/lib/
-
ext/sunmscapi.jar,C:/Java/jdk1.6
- SunTest.java:1: 找不到符號
- 符號: 類 LocaleData
- 位置: 軟體包 sun.util.resources
- import sun.util.resources.LocaleData;
- ^
- [正在裝入 java/lang/Object.class(java/lang:Object.class)]
- [正在檢查 SunTest]
- [總時間 187ms]
- 1 錯誤
新增javac編譯引數,指定bootclasspath,編譯錯誤消失:
-
C:/Temp>javac -bootclasspath C:/Java/jdk1.
- [解析開始時間 SunTest.java]
- [解析已完成時間 15ms]
- [原始檔的搜尋路徑: .]
- [類檔案的搜尋路徑: C:/Java/jdk1.6/jre/lib/rt.jar,C:/Java/jdk1.6/jre/lib/ext/dns
- ns.jar,C:/Java/jdk1.6/jre/lib/ext/localedata.jar,C:/Java/jdk1.6/jre/lib/ext/sunj
- ce_provider.jar,C:/Java/jdk1.6/jre/lib/ext/sunmscapi.jar,C:/Java/jdk1.6/jre/lib/
- ext/sunpkcs11.jar,.]
- [正在裝入 sun/util/resources/LocaleData.class(sun/util/resources:LocaleData.clas
- s)]
- [正在裝入 java/lang/Object.class(java/lang:Object.class)]
- [正在檢查 SunTest]
- [已寫入 SunTest.class]
- [總時間 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