在没有拆分包的情况下实现(编译时)插件架构

时间:2017-08-22 17:25:32

标签: java plugins reflection java-9 java-module

past question中,我问如何设计一个系统:

  • 一个类包含一个或多个可选方法。
  • 可选方法由插件实现,这些插件在编译时可能存在或不存在。
  • 如果用户在编译时调用其关联插件不存在的方法,则会出现编译时错误。

我提供了适用于Java 8的one possible solution

不幸的是,此解决方案取决于Java 9模块系统不允许使用拆分包(导出相同包的两个模块)。

如何在Java 9中实现?

1 个答案:

答案 0 :(得分:0)

<强> Services

如果我已正确理解了您正在使用的问题,那么您需要使用的是模块系统中的服务。

  

Java长期以来通过java.util.ServiceLoader支持服务   class,通过搜索来在运行时定位服务提供者   类路径。

模块系统可以通过扫描模块工件中的类文件来识别ServiceLoader::load方法的调用来识别服务的使用。

使用您当前的项目结构,您应该定义abstract classinterface,它可以是在guavacore模块类中实现的扩展,并提供由他们。

模块使用特定服务是该模块定义的一个重要方面,因此为了效率和清晰度,它在模块的声明中用 uses 子句表示:

module com.foo.bar.sql {
    uses com.foo.Verifiers;
}

模块提供特定服务的实现同样重要,但是,这是通过 provides 子句放在模块的声明中:

module guava {
    provides com.foo.Verifiers with com.guava. GuavaVerifier;
}

module core {
    provides com.foo.CoreVerifier with com.guava. GuavaVerifier;
}