以编程方式启动 OSGi(Equinox)?

Posted

技术标签:

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

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

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

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

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

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

【问题讨论】:

【参考方案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")。请记住,在运行时您将需要所有传递依赖项,而不仅仅是第一级构建时依赖项。 在这种情况下怎么办...***.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 对不起。自从我被转移到不同语言的项目后,我就没有跟上这些东西。快速搜索并没有发现任何东西。

以上是关于以编程方式启动 OSGi(Equinox)?的主要内容,如果未能解决你的问题,请参考以下文章

关闭 OSGi 容器的最佳方法(特别是 Equinox)

在OSGI容器Equinox中嵌入HttpServer

如何在 Equinox 3.10 及更高版本中获取所有已加载的包

Brindy Vaadin OSGi/Guessit -Felix 有效,Equinox 无效

Persistence.xml 和 OSGi (Equinox)

哪个版本的 Eclipse/Equinox 实现了哪个版本的 OSGi?