以编程方式启动 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)?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Equinox 3.10 及更高版本中获取所有已加载的包
Brindy Vaadin OSGi/Guessit -Felix 有效,Equinox 无效