Java9:将自定义模块化运行时映像与第三方插件系统相结合

Java9:将自定义模块化运行时映像与第三方插件系统相结合,java,plugins,dependencies,java-9,java-module,Java,Plugins,Dependencies,Java 9,Java Module,基于MarkReinhold的,我将假设Jigsaw将成为Java9的一部分 在阅读有关Jigsaw的文章时,我问自己一个问题:当我使用定制的模块化运行时映像发布应用程序时会发生什么情况,但第三方模块需要附加的JRE模块,而这些模块不是随应用程序发布的,因为应用程序不需要它们 设想一个应用程序希望从模块化中获益。它提供了一个可由第三方模块实现的服务接口。应用程序加载所有第三方模块,这些模块在应用程序启动时提供服务接口的实现。在我看来,这是一个为第三方插件提供公共API的好方法,我可以想象自己经常

基于MarkReinhold的,我将假设Jigsaw将成为Java9的一部分

在阅读有关Jigsaw的文章时,我问自己一个问题:当我使用定制的模块化运行时映像发布应用程序时会发生什么情况,但第三方模块需要附加的JRE模块,而这些模块不是随应用程序发布的,因为应用程序不需要它们

设想一个应用程序希望从模块化中获益。它提供了一个可由第三方模块实现的服务接口。应用程序加载所有第三方模块,这些模块在应用程序启动时提供服务接口的实现。在我看来,这是一个为第三方插件提供公共API的好方法,我可以想象自己经常使用它

现在,还有一个名为
jlink
的工具,它允许您创建一个应用程序版本,该版本不仅包含应用程序模块,还需要JRE模块。这称为自定义模块化运行时映像。最棒的是,该版本只包含应用程序实际使用的JRE模块,这防止了该版本的规模变得非常大。目前,
jlink
将确定哪些模块必须单独包含。但是,开发人员必须明确地包括提供服务实现的模块,请参阅。我认为这对于开发人员不希望用户安装JRE的许多应用程序来说也是非常好的

当我们尝试在单个应用程序中同时使用这两个模块时,问题就出现了:自定义模块运行时映像只包含应用程序使用的JRE模块。但是,插件可能使用应用程序未使用的JRE模块,因此这些模块在运行时不可用。因此,插件将无法工作


这是我能想到的唯一解决方案,但它还远远不够完美:

将缺少的JRE模块包含到第三方插件中。虽然一开始这似乎是一个简单的解决方案,但实际上会带来一些问题

首先,这需要插件开发人员知道应用程序中包括哪些JRE模块。如果这是未知的,他们可能包括一个JRE模块,该模块在应用程序本身中已经可用,这可能会导致问题。因此,它成为应用程序使用的公共API的一部分。我认为这是不可取的,因为这是一个实现细节。而且,它可能会经常变化

其次,由于可用的JRE模块是公共API的一部分,因此需要以某种方式指定它们。虽然这可以通过文档来实现,但我认为应该通过正式代码来指定。例如,对于插件模块应该可用的所有JRE模块,可以在应用程序模块中使用
requires public
子句。这使得插件可以使用这些JRE模块,因为插件需要应用程序模块

第三,问题是允许插件使用额外的JRE模块是否可取。如果不是,则可能应该为
module info.java
提供一个子句,以指定当前模块是给定其他模块的插件。例如,对于应用程序模块,不使用
require
,而是使用
插件到
或其他符号。这将防止模块需要任何JRE模块。但是,这可能行不通,因为插件模块所需的其他第三方模块可能需要额外的JRE模块。因此,我认为很难支持这种机制

第四,允许插件使用额外的JRE模块也很困难。这要求不同的JRE模块在不同版本中兼容,或者插件开发人员总是在与应用程序中的JRE模块版本兼容的版本中包含额外的JRE模块。我不确定JRE模块是否应该在不同的版本中兼容,但我的假设是它们不应该兼容,因为这将阻止将来的许多更改

我的一些假设是错误的吗?也许在应用程序和插件中包含一个JRE模块就可以了?也许插件中的附加JRE模块也不必与应用程序中的JRE模块兼容?毕竟,它们可能不会相互影响


我们应该如何处理这个架构问题?是否还有其他语言具有模块化和部分可发布的运行时?他们是如何解决这个问题的


请注意,像Google guava或Apache commons这样的常用库可能会出现类似的问题。然而,这个问题应该主要是关于使用自定义模块化运行时映像所产生的问题。

我有着完全相同的想法,并且考虑了好几天。似乎没有什么好的资源来解决这个问题。我的想法是定制框架。该框架允许第三方模块通过使用配置文件请求附加的依赖模块。然后,框架将决定(可以通过用户交互完成)模块是否将安装到应用程序中。JRE模块可以直接安装到JRE模块文件夹中,其他模块可以复制到自定义文件夹中以便于维护。但是这个解决方案需要Oracle提供一些端点,允许开发人员下载单个jmod文件