问题描述
启动层中的PluginLoader
模块在运行时使用ModuleLayer
为每个Module
实例化一个自定义ModuleLayer::defineModulesWithOneLoader
。
我们现在有一组非模块化插件,它们需要访问自定义层内的模块化插件。将在实例化自定义图层后加载它们。如何实现?
仅将它们放在类路径上是行不通的,因为将再次加载模块化类,而不是使用模块化插件中的(已加载)类。
我们的下一个尝试是创建一个虚拟插件,最后将其加载到一个以所有其他层(因此是模块化插件)为父层的层中。似乎无法将URL添加到defineModulesWithOneLoader
方法生成的类加载器中。相反,我们创建了一个自定义urlclassloader作为该类加载器的父级,并通过urlclassloader::addURL
添加了非模块化JAR。
这适用于非模块化插件类。但是,如果从这样的类引用了已在其中一个模块插件中加载的类,则该类还将尝试使用我们的自定义urlclassloader
加载该类(由于父类为null
,因此将失败)而不是模块的内部类加载器,后者委派给父层。有没有一种方法可以在类加载器的未命名模块中加载我们的非模块插件的类,该类加载器的行为类似于JPMS的默认类加载器(首先搜索父层),但如果不是,则仍在非模块JAR内加载类在父图层中找不到?
可以通过使用自动模块来解决此问题,但是我们现在要避免这种情况,因为它会导致许多其他必要的更改(例如解析拆分包),而这些更改我们目前没有资源。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)