我正在研究jvm的类加载过程,了解到以下事实:
类加载器子系统使用委托(delegate)层次算法 它将按照BootStrap路径-->扩展路径-->应用程序路径的顺序搜索。
然后我想用下面的真实代码“尝试”这个:
创建A类,B类;具有 main() 方法和类型 B 变量的 A 类。
编译后,我用jar命令从B.class中获取B类的jar文件,然后删除B.class文件,将B.jar文件放到jdk/jre/lib/ext (因为 oracle 文档说 extClassLoader 不会在 jdk/jre/lib/ext 中搜索任何松散的类文件)。
结果是 ClassNotFoundException 。所以我的问题是:
1) jvm 是否不允许从 BootStrap 和扩展类路径加载用户的 clasfile?
2) 如果是这样,为什么它使用委托(delegate)层次算法加载,这似乎导致效率低下?
谢谢....
最佳答案
事情似乎有点奇怪。
经过几次 ClassNotFoundException 后,我得到了 java.lang.IllegalAccessError,这至少表明 extclassloader 正在尝试访问我的类 B.jar
因为我没有为 A 类和 B 类声明一个包,这可能是原因,所以我只是在我的 B 类之前添加了一个 public 修饰符并做了与上面相同的操作,最后 ExtClassLoader 与我的 B.jar 一起工作。
尽管仍然不知道为什么 jvm 第一次忽略了我的 jar 文件,后来又读取了它....似乎 jvm 保留了目录列表(BootStrap 和 Ext 类路径)的捕获器,它不会及时更新就像我的电脑系统
关于java - JVM 类加载器无法从扩展类路径加载自定义 jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38690725/