Java模块层:从未命名的模块

问题描述

我们有一个具有多个模块层的插件系统:

启动层中的PluginLoader模块在​​运行时使用ModuleLayer为每个Module实例化一个自定义ModuleLayer::defineModulesWithOneLoader

我们现在有一组非模块化插件,它们需要访问自定义层内的模块化插件。将在实例化自定义图层后加载它们。如何实现?

仅将它们放在类路径上是行不通的,因为将再次加载模块化类,而不是使用模块化插件中的(已加载)类。

我们的下一个尝试是创建一个虚拟插件,最后将其加载到一个以所有其他层(因此是模块化插件)为父层的层中。似乎无法将URL添加defineModulesWithOneLoader方法生成的类加载器中。相反,我们创建了一个自定义urlclassloader作为该类加载器的父级,并通过urlclassloader::addURL添加了非模块化JAR。

这适用于非模块化插件类。但是,如果从这样的类引用了已在其中一个模块插件中加载的类,则该类还将尝试使用我们的自定义urlclassloader加载该类(由于父类null,因此将失败)而不是模块的内部类加载器,后者委派给父层。有没有一种方法可以在类加载器的未命名模块中加载我们的非模块插件的类,该类加载器的行为类似于JPMS的认类加载器(首先搜索父层),但如果不是,则仍在非模块JAR内加载类在父图层中找不到?

可以通过使用自动模块来解决此问题,但是我们现在要避免这种情况,因为它会导致许多其他必要的更改(例如解析拆分包),而这些更改我们目前没有资源。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)