在Java中实现动态插件

Chr*_*way 18 java plugins osgi guice peaberry

我想在Java应用程序中实现动态插件功能.理想的情况是:

  • 应用程序将Plugin使用类似的方法定义接口getCapabilities().
  • 插件将是一个pluginX.jar包含PluginXImpl实现Plugin(可能还有其他一些)的类的JAR .
  • 用户将放入pluginX.jar特殊目录或设置指向它的配置参数.用户不一定必须包含pluginX.jar在他们的类路径中.
  • 应用程序会找到PluginXImpl(可能通过JAR清单,可能通过反射)并将其添加到注册表中.
  • 客户端可以PluginXImpl例如通过调用类似的方法来获取实例getPluginWithCapabilities("X").用户不一定必须知道插件的名称.

我有一种感觉,我应该能够用peaberry做到这一点,但我无法理解文档.我花了一些时间学习Guice,所以我的首选答案不是"使用Spring Dynamic Modules".

任何人都可以给我一个简单的想法,如何使用Guice/peaberry,OSGi,或只是简单的Java?

jar*_*bjo 17

使用普通Java意味着这很简单:

由于您不希望用户在启动应用程序之前配置类路径,因此我首先要创建一个URLClassLoader,其中包含插件目录中文件的URL数组.使用File.listFiles查找所有插件jar,然后使用File.toURI().toURL()获取每个文件的URL.您应该将系统类加载器(ClassLoader.getSystemClassLoader())作为父类传递给URLClassLoader.

如果插件jar包含META-INF/services中的配置文件,如java.util.ServiceLoader的API文档中所述,您现在可以使用ServiceLoader.load(Plugin.class,myUrlClassLoader)来获取插件接口的服务加载器并在其上调用iterator()以获取所有已配置的插件实现的实例.

你仍然需要提供你自己的包装来过滤插件功能,但我认为这应该不会太麻烦.

  • 除非你有更详细的问题。 (2认同)