【问题标题】:OSGi or URLClassLoader?OSGi 还是 URLClassLoader?
【发布时间】:2011-02-22 05:41:31
【问题描述】:

我有一个相当简单的场景:

我的应用程序有包含我的应用程序逻辑的核心 jar 文件。这个核心 jar 应该在运行时动态监视文件夹,当插件 jar 被放置在那里时,它应该加载它并准备好使用它。可能有很多插件jar。

在您的经验中,最快且最易于维护的实现方式是什么?我有两个建议:

1) 一些 OSGi 容器,Apache Felix 文件安装(用于监视新包的目录)。而核心 jar 作为捆绑包安装到容器中。

1.1 问题是核心jar 应该如何检测新安装的bundle 是它的插件?有没有办法监视每个添加的捆绑包并使用我的独特字符串(例如“kalazplugin”)寻找某种设置?换句话说:如何区分我的插件包?

2) 只是观察目录的变化,当 jar 被删除时,然后使用 URLClassLoader 动态加载它并自己实现它。我可能需要为每个插件指定某种配置文件,例如指定一些设置...

【问题讨论】:

    标签: java plugins osgi


    【解决方案1】:

    如果您使用 OSGi,您可以使用 Extender Pattern 来观察任何捆绑包(已经安装并稍后安装)并在您确定捆绑包是​​您的插件之一时采取任何行动。该模式很容易实现,尤其是在 OSGi 4.2 上,它已经包含一个 BundleTracker,但在早期的 OSGi 版本上只是稍微难一些。

    只要谷歌“osgi 扩展器模式”,你就会看到很多参考和实现。

    【讨论】:

    • 谢谢,我将使用 Felix 的 iPOJO 实现。但是我认为几乎相同的功能可以(理论上)通过使用标准的 BundleActivator 类来完成,而我所有的“扩展”都实现了相同的接口。与扩展器模式相比,是否有任何权衡(除了更多代码)?
    • 是的,您可以在 BundleActivator 中执行相同的操作,但是,如果您有 200 个插件,这将相当于 200 个 BundleActivator,对插件注册过程的任何更改都需要更改和重新部署 200 个插件包!你明白了。
    • 扩展器模式可能不是最佳选择,尽管 OP 并没有具体说明他在安装这些库后实际上想要 做什么 。大概你想从中加载一个类?最好使用对象而不是类来执行此操作……即使用 OSGi 服务注册表。只需定义一个接口并允许您的插件 JAR 发布该接口的实例。
    【解决方案2】:

    你可以参考 'org.eclipse.equinox.p2.directorywatcher' 的实现,它可以做你想做的事情。

    【讨论】:

      猜你喜欢
      • 2011-03-05
      • 1970-01-01
      • 2012-03-21
      • 1970-01-01
      • 2015-06-23
      • 1970-01-01
      • 1970-01-01
      • 2017-12-17
      • 1970-01-01
      相关资源
      最近更新 更多