【问题标题】:Programmatically Start OSGi (Equinox)?以编程方式启动 OSGi(Equinox)?
【发布时间】:2011-06-08 02:06:18
【问题描述】:

我希望能够轻松启动 OSGi 框架(最好是 Equinox)并从 java main 加载我的 pom 中列出的任何包。

这可能吗?如果有,怎么做?

似乎 pax 工具可以做到这一点,但我似乎找不到任何说明这一点的文档。我知道我可以像这样启动 Equinox:

BundleContext context = EclipseStarter.startup( ( new String[] { "-console" } ), null );

但我想做更多——就像我说的:加载更多的捆绑包,也许启动一些服务等等。

【问题讨论】:

    标签: java maven osgi pax


    【解决方案1】:

    任何 OSGi 框架(R4.1 或更高版本)都可以使用FrameworkFactory API 以编程方式启动:

    ServiceLoader<FrameworkFactory> ffs = ServiceLoader.load(FrameworkFactory.class);
    FrameworkFactory ff = ffs.iterator().next();
    Map<String,Object> config = new HashMap<String,Object>();
    // add some params to config ...
    Framework fwk = ff.newFramework(config);
    fwk.start();
    

    OSGi 框架现在正在运行。由于Framework 扩展了Bundle,您可以调用getBundleContext 并调用所有常规API 方法来操作捆绑包、注册服务等。例如

    BundleContext bc = fwk.getBundleContext();
    bc.installBundle("file:/path/to/bundle.jar");
    bc.registerService(MyService.class.getName(), new MyServiceImpl(), null);
    // ...
    

    最后你应该等待框架关闭:

    fwk.stop();
    fwk.waitForStop(0);
    

    重申一下,这种方法适用于任何 OSGi 框架,包括 Equinox 和 Felix,只需将框架 JAR 放在类路径中即可。

    【讨论】:

    • 这很有帮助,谢谢。我一直在为如何启动和停止框架而苦苦挣扎(重定向 System.in 并不那么吸引人)。我唯一坚持接受的是,我希望能够从我的 Maven 类路径中加载我的包,而不必硬编码一堆路径等等。再说一次,我可能希望太多:)
    • Maven 类路径是什么意思?
    • 我的 POM 中确实存在任何依赖项 - 我希望能够检测并安装它们。
    • 那么您需要从 POM 中获取该信息。这是一个 Maven 问题。 Maven 是否提供您可以调用的 API?或者你可以只解析 XML 吗?我对此一无所知。编辑:KitsuneYMG 引用的 maven URL 处理程序(见他的评论)看起来很有希望。将其安装为服务,然后执行installBundle("mvn://repo/groupId/artifactId")。请记住,在运行时您将需要所有传递依赖项,而不仅仅是第一级构建时依赖项。
    • 在这种情况下怎么办...stackoverflow.com/questions/6522285/…
    【解决方案2】:

    这个帖子可能有点陈旧,但无论如何......

    Pax 对 maven url 有很好的支持,它甚至有一个 wrap url 处理程序,允许您将非 osgi jar 动态转换为漂亮整洁的包。

    http://wiki.ops4j.org/display/paxurl/Mvn+Protocol

        <dependency>
            <groupId>org.ops4j.pax.url</groupId>
            <artifactId>pax-url-wrap</artifactId>
            <version>1.2.5</version>        
        </dependency>
        <dependency>
            <groupId>org.ops4j.pax.url</groupId>
            <artifactId>pax-url-mvn</artifactId>
            <version>1.2.5</version>        
        </dependency>
    

    那么命令将是:

    install -s mvn:groupId:artifactId:version:classifier
    

    注意:先有鸡还是先有蛋的场景 - 您必须先使用 file: url 处理程序安装它们,或者将它们放入 autodeploy 目录。

    Karaf 将这一切都内置到它的发行版中,所以也许看看 Karaf 启动器源代码?

    第二个注意事项:通过将@snapshots 附加到 repo URL 来启用部署快照,通过 ConfigAdmin 管理配置

    在管理所有 POM 定义的依赖项方面,请查看 Karaf 功能 - 有一个插件可以生成功能 XML 文件,然后可以使用该文件部署整个应用程序: http://karaf.apache.org/manual/2.1.99-SNAPSHOT/developers-guide/features-maven-plugin.html

    此外,此 XML 工件还可以部署到您的 OBR,因此您可以采用普通的 Felix/Equinox/Karaf 设置,添加 mvn url 处理程序并使用您公司的 mvn 存储库进行配置,然后配置整个应用程序 =)

    【讨论】:

      【解决方案3】:

      编辑:意识到你想从 java 内部开始。看书不够仔细,可惜了

      查看此链接。 http://www.eclipsezone.com/eclipse/forums/t93976.rhtml

      基本上

      public static void main(String args[]) throws Exception {
        String[] equinoxArgs = {"-console","1234","-noExit"};
        BundleContext context = EclipseStarter.startup(equinoxArgs,null);
        Bundle bundle = context.installBundle(
          "http://www.eclipsezone.com/files/jsig/bundles/HelloWorld.jar");
        bundle.start();
      }
      

      编辑:Maven

      https://groups.google.com/group/spring-osgi/web/maven-url-handler?pli=1 似乎包含一个 OSGi URl 处理程序服务,它可以获取以下格式的 URL 并从中加载包 (mvn://repo/bundle_path)

      【讨论】:

      • 我已经掌握了大部分内容,并且也考虑过从 http url 加载 - 你碰巧知道如何从 maven 加载包吗?
      • @javamonkey79 我从未使用过 Maven。但是,groups.google.com/group/spring-osgi/web/maven-url-handler?pli=1 看起来很有希望
      • @KitsuneYMG:谷歌链接坏了。你还有其他我可以使用的链接吗?感谢您的帮助..
      • @javamonkey79 对不起。自从我被转移到不同语言的项目后,我就没有跟上这些东西。快速搜索并没有发现任何东西。
      猜你喜欢
      • 2017-06-02
      • 1970-01-01
      • 2014-01-12
      • 2013-08-17
      • 2014-11-02
      • 1970-01-01
      • 2015-02-06
      • 1970-01-01
      相关资源
      最近更新 更多