Java JVM类加载器无法从扩展类路径加载自定义jar

Java JVM类加载器无法从扩展类路径加载自定义jar,java,jvm,Java,Jvm,我正在研究jvm类加载过程,并了解以下事实: 类加载器子系统使用委托层次结构算法 它将按照引导路径-->扩展路径-->应用程序路径的顺序进行搜索。 然后我想在实际代码中“尝试”如下: 创建a类和B类;使用main()方法和类型B变量初始化A 编译后,我使用jar命令从B.Class获取类B的jar文件,然后删除B.Class文件,将B.jar文件放到jdk/jre/lib/ext (因为oracle文档说extClassLoader不会在jdk/jre/lib/ext中搜索任何松散的类文件) 结

我正在研究jvm类加载过程,并了解以下事实:

类加载器子系统使用委托层次结构算法 它将按照引导路径-->扩展路径-->应用程序路径的顺序进行搜索。

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

创建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不允许从引导和扩展类路径加载用户的类文件吗

2) 如果是这样的话,为什么它的加载使用一个委托层次结构算法,这似乎会导致低效率


事情似乎有点奇怪

在多次ClassNotFoundException之后,我得到了java.lang.IllegalAccessError,这至少表明extclassloader正在尝试访问我的类B.jar

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


虽然仍然不知道为什么jvm第一次忽略我的jar文件,然后再读取它…似乎jvm保留了一个目录列表(引导和Ext类路径),它不像我的计算机系统那样及时更新,听起来你在部署中做了一些错误的事情

我过去使用过
lib/approved
,即使是内部
java.lang*
类也没有问题


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

JVM使用ExtensionClassLoader加载您自己的jar包。因此,您可以尝试使用此CalsLoader加载类,看看实际发生了什么。这似乎并不能回答您自己的问题。我想把这一点补充到问题中。