2016-08-01 106 views
4

我学习了JVM类加载过程的定制罐,并得到了解以下事实:JVM类加载器无法加载从扩展类路径

的类装载器子系统采用了代表团分级结构算法 它将搜索从BootStrap路径 - >扩展路径 - >应用程序路径的顺序。

然后我想“试试”这在如下实际代码:

创建A类和B类; A类与main()方法和一个B类型变量。

编译后,我用jar命令从B.class中得到B类的jar文件,然后删除B.class文件,把B.jar文件放到jdk/jre/lib/ext中 (由于oracle doc说extClassLoader不会在jdk/jre/lib/ext中搜索任何松散的类文件)。

结果是ClassNotFoundException的。所以我的问题是:

1)是否JVM不允许用户clasfile加载从引导程序和扩展类路径? 2)如果是这样,为什么它使用委托层次结构算法加载,这似乎导致效率低下?

tks ....

+0

JVM使用ExtensionClassLoader加载你自己的jar包,你可以尝试使用这个calssLoader来加载这个类并且看看实际发生了什么。 –

回答

0

事情看起来有点奇怪。

后ClassNotFoundException的几次,我java.lang.IllegalAccessError这至少表明是的ExtClassLoader试图访问我的课B.jar

,因为我没有声明包A类和B,这可能是原因,所以我只是在我的B类之前添加了一个公共修饰符,并且与上面一样,最后ExtClassLoader与我的B.jar一起工作。

尽管仍然不知道为什么第一次jvm忽略我的jar文件,后来阅读它....似乎jvm保持目录列表(BootStrap和Ext类路径的)catche,它不更新只是在 - 像我的电脑系统的时间

+0

这似乎不是您自己的问题的答案。我会在这个问题上加上这个。 –

0

这听起来像你在部署中做错了什么。

我以前使用lib/endorsed过去没有问题,即使是内部java.lang*类。

JVM不会缓存任何内容,从一次运行到下一次运行。