很奇怪的bootclasspath参数

尝试下面代码:

import sun.util.resources.LocaleData; public class SunTest{ public SunTest(){ } }

编译时报错:

C:/Temp>javac -verbose SunTest.java [解析开始时间 SunTest.java] [解析已完成时间 63ms] [源文件的搜索路径: .] [类文件的搜索路径: C:/Java/jdk1.6/jre/lib/resources.jar,C:/Java/jdk1.6/jre/lib/ 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/jre/lib/ext/sunpkcs11.jar,.] 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.6/jre/lib/rt.jar -verbose SunTest.java [解析开始时间 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

 

你可能感兴趣的:(Java基础,笔记心得)