java - Java Classloader 资源仅对特定实例可见
问题描述
我正在尝试将资源加载到库的运行时中。但在我当前的实现中,只有非常具体的 URLClassLoader 实例才能看到它。
URLClassLoader classLoader = new URLClassLoader(urls, ClassLoader.getSystemClassLoader());
classLoader.addFile(super.getResource(urlPath));
classLoader.classLoader.getResourceAsStream(path) //works
URLClassLoader secondClassLoader = new URLClassLoader(urls, ClassLoader.getSystemClassLoader());
secondClassLoader.classLoader.getResourceAsStream(path) // doesn't work
另一个问题是,我不知道库实际使用哪个 ClassLoader 作为父级。最好的解决方案是每个类加载器都可以访问资源。
如何确保所有类加载器都可以访问动态加载的资源?
解决方案
看起来,您有两种选择(尽管两种解决方案的工作原理相似)。
通用解决方案(无自定义类加载器):从应用程序类加载器加载资源。这可以通过确保资源位置包含在您的应用程序类路径中来实现(将资源保存为应用程序 jar 文件的一部分是实现此目的的一种方法)。
有点复杂(使用自定义类加载器):在这种情况下,您必须确保将资源路径添加到所有自定义类加载器的类路径中。更简单和更简洁的方法是定义一个超级自定义类加载器并从这个超级加载器继承所有其他类加载器。并将资源加载到超级类加载器的类路径中。
到现在为止,我希望您了解基本原理:如果给定资源在其父类路径(递归)或它们自己的类路径中可见,则类加载器将能够加载给定资源。
推荐阅读
- c# - Google Calendar API 事件颜色
- javascript - 无法从 upvotes 部分中删除用户 ID
- debugging - Xdebug:出现某个输出时如何中断程序?
- python - 使用 Textblob-de 对德语文本进行词形还原
- css - 物化CSS的涟漪效应问题
- google-sheets - 带有计数、分组、排序功能的查询结果
- laravel - 如何处理 Laravel Passport 中的 OAuth 异常?
- react-native - 如何在 expo sdk33 中加载“ionicons”字体?
- sql - 我们可以通过过滤类别来更改小计吗?
- php - php将字符串表示形式转换为正确的类型