【问题标题】:How to auto-start/eager start OSGi services on Eclipse platform如何在 Eclipse 平台上自动启动/急切启动 OSGi 服务
【发布时间】:2012-03-29 08:07:08
【问题描述】:

我开发了一个 Eclipse RCP 应用程序,它大量使用了 OSGi 包,这些包提供服务供以后使用。用例要求捆绑包注册其服务(例如导入过滤器),以便稍后在不同情况下使用。 OSGi 捆绑包是使用 maven-bundle-plugin 构建的。

如何让 Equinox 自动启动 OSGi 包?通过 Activator 的正常方法不起作用。只有惰性模式有效,但我无法触摸未知包中的类。我阅读了 OSGi 规范,并没有提供与延迟加载相反的急切加载。是否还有机会将捆绑包标记为自动加载?

在 Eclipse 中,我有机会将 Auto-Start 设置为 true,但是在 Maven 和 Tycho 构建的发行版中我该怎么办?

由于未加载 org.eclipse.equinox.ds 的问题,声明式服务无法运行。我可以以某种方式启动它而不是激活器吗?这也是一个解决方案,但我不知道如何构建发行版或设置什么配置。

这里有哪些最佳做法?还有其他可能吗? Eclipse 平台上的 OSGi 包的文档有点薄。

【问题讨论】:

  • 我不了解 maven/tycho。但是如果你使用 pde ant 脚本,它会使用config.ini 来控制自动启动。查看workspace\.metadata\.plugins\org.eclipse.pde.core\your-rcp-product-name.product下生成的config.ini

标签: eclipse eclipse-plugin eclipse-rcp osgi


【解决方案1】:

您可以在插件中使用“org.eclipse.ui.startup”扩展点。这允许您指定将在 Eclipse UI 启动时调用的 IStartup 类。只要这是你的包中的一个类,那么你的包就会启动。

这意味着包含一个 plugin.xml 文件,这将是一个专门的 Eclipse 插件而不是一个标准的 OSGi 包,但是您可以使用这个插件来激活您的任何标准 OSGi 包。

【讨论】:

  • 我使用的一些包相当通用,我不想让它们成为 Eclipse 插件。我知道,将 plugin.xml 和其他文件捆绑到 jar 中不是问题,但我认为它不是很干净。你的建议很好,我认为它会起作用,但我认为这是我最后的选择。还是谢谢!
  • 我认为没有必要修改您当前的捆绑包。 Eclipse 插件可能只是一个新的包,其唯一工作是确保 DS 包已启动,这样您的声明性服务就会全部被找到。这避免了必须在 config.ini 文件中指定启动包。
【解决方案2】:

叹息。您是 Eclipse 中防止(愚蠢的)程序员延长启动时间的错误策略的受害者。他们没有警告,而是决定根本不启动捆绑包。这与 OSGi 推荐的相反 :-( 只有当有人从中加载一个类时,一个包才能被激活(它们基本上是无效的启动)(这就是延迟激活。)

迄今为止最好的解决方案是使用声明式服务。你可以声明即时服务,它会在启动时被激活,你可以声明惰性服务,它会在使用时被激活。懒惰的人当然是首选(当您不是愚蠢的程序员时),但某些用例需要立即使用,例如通过互联网提供服务的服务器。您必须在 config.ini 中确保 DS 已启动。

【讨论】:

  • 是的,我已经阅读了不同的哲学。我喜欢并支持延迟加载,但正如您所提到的:有些设计需要自动加载来注册服务(白板模式)。我将尝试声明式服务。
  • 正如你所说,Eclipse 通常不会启动任何包,除非在配置中明确列出,或者它使用延迟激活并且有一个由其他包加载的类。这对于 DS 来说是个问题,因为已停止/已安装的捆绑软件会被忽略。但是,我确实注意到 Equinox 服务组件运行时有一个隐藏功能:如果您将包声明为延迟加载并且您的组件标记为“立即”,则 SCR 将为您启动您的包 (很可能是因为 SCR 认为,如果没有人启动它,就没有其他人会启动它)。还不知道非即时行为。
【解决方案3】:

您在声明式服务方面走在了正确的轨道上。手动注册您的服务很像艰苦的工作,安全地查找它们可能是更多的工作,而且很难做到正确。这方面需要注意的另一个标准是蓝图,但如果您有 DS 元数据,我当然不建议您重写任何东西。蓝图在非常动态的环境中具有更好的特性,并且配置更丰富。 (我是 Blueprint 实现之一 Apache Aries 的提交者。)对于 Blueprint 和 DS,重要的是还有其他东西正在为您管理服务。

这让我们回到了为什么您的捆绑包没有启动的问题。我认为他们确实从费利克斯开始的事实一定有线索。您是否启动了 Equinox 控制台并确认您的所有捆绑软件都已安装并已解决? ('ss' 列出捆绑包。) 您是否查看了 config.ini 文件并确认列出了您的捆绑包,并且具有适当的启动级别 - 或者您是否使用 Equinox 自动启动其他所有捆绑包?

【讨论】:

  • 是的,接下来我将尝试声明式服务。稍后我会告诉你。
  • 所以,它正在工作。我让 DS 在运行时启动,然后通过 XML 声明服务。之前的服务都解决了,没有启动。我怎么能影响它,我不知道。但 DS 正在工作。
【解决方案4】:

您可以将其添加到您的 .product 文件中:

<configurations>
    <plugin id="my.plugin.id" autoStart="true" startLevel="4" />
</configurations>

或者,在 Eclipse 中打开 .product 文件并转到“配置”选项卡,并在其中添加具有所需启动级别的插件。

【讨论】:

    【解决方案5】:

    MANIFEST.MF 有这个:

    Bundle-ActivationPolicy: lazy
    

    这也很有用:

    http://wiki.eclipse.org/Lazy_Start_Bundles#Should_I_change_to_the_new_Bundle-ActivationPolicy_Header.3F

    但是我会说我会尝试尽可能多地依赖 OSGI 激活。如果没有其他方法可以解决您的问题,那么上一个链接可能会有所帮助。

    【讨论】:

    • 对于延迟加载,我的应用程序需要了解要激活的捆绑包。这是不想要的,也不是一个好的设计。这就是我删除延迟加载的原因。在 Felix 中,我的包被正确激活。只是 Equinox 制造了一些麻烦。我需要的是 'Bundle-ActivationPolicy: auto',但这不受支持。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 1970-01-01
    • 2021-06-01
    • 1970-01-01
    • 2018-09-20
    • 1970-01-01
    • 2011-02-12
    相关资源
    最近更新 更多