我想在Java应用程序中实现一个动态插件特性。理想情况是:
Plugin的方法定义一个接口getCapabilities()。pluginX.jar,它包含一个实现Plugin的类PluginXImpl (可能还有其他一些)。pluginX.jar放在一个特殊的目录中,或者设置指向它的配置参数。用户不一定必须在其类路径中包括pluginX.jar。PluginXImpl (可能通过JAR清单,也可能通过反射)并将其添加到注册表中。PluginXImpl的一个实例,例如,通过调用像getPluginWithCapabilities("X")这样的方法。用户不必知道插件的名称。我有一种感觉--我应该能够用皮贝里来完成这个任务,但是我对文档没有任何意义。我花了一些时间学习Guice,所以我更喜欢的答案不是“使用弹簧动模”。
有人能告诉我如何使用Guice/peaberry、OSGi或普通Java来完成这个任务吗?
发布于 2010-01-20 21:22:57
这实际上很容易使用普通的Java方法:
由于您不希望用户在启动应用程序之前配置类路径,所以我首先要为插件目录中的文件创建一个带有URL数组的URLClassLoader。使用File.listFiles查找所有插件jars,然后使用File.toURI().toURL()获取每个文件的URL。您应该将系统类加载器(ClassLoader.getSystemClassLoader())作为父类传递给您的URLClassLoader。
如果插件jars中包含java.util.ServiceLoader的API文档中描述的META/services中的配置文件,那么现在可以使用ServiceLoader.load(Plugin.class,myUrlClassLoader)为您的插件接口设置一个服务加载器,并在其上调用iterator()来获取所有已配置插件实现的实例。
你仍然需要提供你自己的包装来过滤插件的能力,但我想这不会有太大的麻烦。
发布于 2010-01-20 21:43:11
如果您想在运行时i.g期间替换插件,OSGI就可以了。用于24/7环境中的错误修复。我在OSGI上玩了一段时间,但是它花费了太多的时间,因为这不是一个要求,如果您删除一个包,您需要一个计划b。
我当时的解决方案是提供一个带有插件描述符类类名的属性文件,并让服务器调用它们来注册(包括查询它们的功能)。
这显然不是最优的,但我迫不及待地想读一下已被接受的答案。
发布于 2010-01-21 01:19:36
任何你可以利用服务提供者接口的机会
https://stackoverflow.com/questions/2104821
复制相似问题