我们有一个包含多个模块层的插件系统:
PluginLoader
引导层内的模块在运行时为每个模块实例化一个自ModuleLayer
定义.Module
ModuleLayer::defineModulesWithOneLoader
我们现在有一组非模块化插件,需要访问自定义层内的模块化插件。它们将在自定义层被实例化后加载。如何做到这一点?
简单地将它们放在类路径上是行不通的,因为模块化类将被第二次加载,而不是使用模块化插件中的(已经加载的)类。
我们的下一个尝试是创建一个虚拟插件并将其最后加载到一个层中,该层具有所有其他层(因此是模块化插件)作为父层。似乎无法将 URL 添加到该defineModulesWithOneLoader
方法生成的类加载器。相反,我们创建了一个自定义 URLClassLoader 作为此类加载器的父级,并通过URLClassLoader::addURL
.
这适用于非模块化插件类。然而,如果一个已经加载在一个模块化插件中的类被这样一个类引用,它也会尝试用我们的自定义加载类URLClassLoader
(失败,因为父级是null
)而不是模块的内部类加载器,它委托到父层。有没有办法将我们的非模块化插件的类加载到类加载器的未命名模块中,该模块的行为类似于 JPMS 的默认类加载器(首先搜索父层),但仍将类加载到非模块化 JAR 中,如果它们是在父层中找不到?
可以通过使用自动模块来解决这个问题,但我们现在想避免这种情况,因为它会导致我们目前没有资源进行的一系列其他必要的更改(例如解析拆分包)。