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

标签 java jvm

我正在研究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/

相关文章:

java - 检测手机 hibernate 时的手势

java - Grails 分页问题

java - 从集合中取回对象

java - MySQL 和 Spring Boot : lost connections after some interval of inactivity

mysql - 日志记录级别低,导致关闭 Hook 无法正常运行

python - 保存堆栈?

java - ThreadPoolExecutor 中的线程何时死亡

java - Apache NetBeans 9.0 是否支持 java 11?

java - 什么是 native 内存或 c 堆

java - 在 CUDA 上运行 JVM