【问题标题】:How to run an OSGi framework within usual java-code?如何在通常的 java 代码中运行 OSGi 框架?
【发布时间】:2010-10-28 14:11:03
【问题描述】:

谁能给我一个如何使用osgi框架类的例子?我不知道如何使用这些类...

BR,

马库斯

【问题讨论】:

标签: java osgi


【解决方案1】:

我最近创建了一个关于如何在 Java 中嵌入 Equinox OSGi 运行时的简单概念验证。详情请关注我在 Github 的项目https://github.com/sarxos/equinox-launcher

【讨论】:

    【解决方案2】:

    在 OSGi 4.1 中,这是标准化的。看看http://njbartlett.name/2011/03/07/embedding-osgi.html,它解释了如何嵌入任何 OSGi 容器。

    【讨论】:

      【解决方案3】:

      这取决于您使用的 OSGi 实现。我使用 Eclipse Equinox 并从常规 java 类中启动框架。 Eclipse jar(称为 org.eclipse.osgi_longversion.jar)有一个名为 org.eclipse.core.runtime.adaptor.EclipseStarter 的类。这将启动您的 OSGi 框架。

      Properties props = new Properties();
      // add some properties to config the framework
      EclipseStarter.setInitialProperties(props);
      BundleContext context = EclipseStarter.startup(new String[]{},null);
      

      您需要一些属性来配置框架。您可以看到所有记录在案的属性here。一旦你调用启动,你收到的 BundleContext 就是系统包上下文,所以你可以从这里安装/启动/停止包。

      如果您设置了所有属性,则不必将任何参数传递给 startup()。

      您可以从Equinox website 下载所有 Equinox 和其他捆绑包。

      【讨论】:

      • 谢谢!现在我能够从我的 java 代码中运行带有一些包的 Equinox 框架 :) 但我仍然有点困惑:如果我使用参数 -console 来运行 Equinox 控制台并在之后停止系统包,线程在我向控制台发送命令之前不会停止。也许系统包中有某种循环等待新命令?!?
      • 停止捆绑包,即使是系统捆绑包,也不一定告诉应用程序关闭。控制台,当你发出“关闭”,它真正的作用是停止所有的包,注销服务和处理程序等,然后调用 System.exit(0)。
      • 是否必须设置任何特殊属性才能从命令行使用 EclipseStarter 类?目前,如果我直接从 IDE 运行我的程序,我只能使用这个类。如果我将它导出到 jar 文件,则启动类会加载系统包而不是 osgi 服务包...因此无法安装包...
      • 这些是我在启动Framework之前设置的基本属性: osgi.console= (if number, goto port, if empty, goto stdout) osgi.noShutdown=true (这是一个app,不要如果不是 Eclipse,则关闭)osgi.clean=true(在启动时清除包缓存)osgi.bundles=(要加载的包的路径的逗号分隔列表)
      【解决方案4】:

      规范没有定义如何实例化、配置和启动 OSGi 框架。因此,从您常用的 Java 代码运行 OSGi 框架总是特定于给定的框架实现(Equinox、Felix、Knopplerfish 等)。

      Apache Felix(一个开源OSGi 框架)嵌入到您的应用程序中相当容易。

      更多信息请参见http://felix.apache.org/site/launching-and-embedding-apache-felix.html

      【讨论】:

      • 我不确定我是否真的想使用 Equinox 之外的另一个 OSGi 框架。我正在寻找解释如何使用类 org.eclipse.osgi.framework.internal.core.OSGi 的示例。直到现在我只在一个德语论坛上找到了一个不完整的例子:java-forum.org/plattformprogrammierung/…
      • 你不应该使用你提到的包中的类。这个包是“内部的”,而不是从包中导出的。在 Equinox 中访问 OSGi 事物通常是通过 org.osgi.framework 中的接口来执行的。
      【解决方案5】:

      查看项目equinox-headless-service。它有启动Equinox的代码。

      【讨论】:

        【解决方案6】:
        猜你喜欢
        • 2012-03-31
        • 2017-06-02
        • 2013-06-22
        • 1970-01-01
        • 2012-11-08
        • 1970-01-01
        • 1970-01-01
        • 2015-12-11
        • 2021-03-22
        相关资源
        最近更新 更多