首页 > 解决方案 > 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 作为父级。最好的解决方案是每个类加载器都可以访问资源。

如何确保所有类加载器都可以访问动态加载的资源?

标签: javareflectionclassloaderdynamic-class-loaders

解决方案


看起来,您有两种选择(尽管两种解决方案的工作原理相似)。

通用解决方案(无自定义类加载器):从应用程序类加载器加载资源。这可以通过确保资源位置包含在您的应用程序类路径中来实现(将资源保存为应用程序 jar 文件的一部分是实现此目的的一种方法)。

有点复杂(使用自定义类加载器):在这种情况下,您必须确保将资源路径添加到所有自定义类加载器的类路径中。更简单和更简洁的方法是定义一个超级自定义类加载器并从这个超级加载器继承所有其他类加载器。并将资源加载到超级类加载器的类路径中。

到现在为止,我希望您了解基本原理:如果给定资源在其父类路径(递归)或它们自己的类路径中可见,则类加载器将能够加载给定资源。


推荐阅读