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

2022-09-01 15:11:00

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

这可能吗?如果是这样,如何?

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

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

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


答案 1

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

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 框架现在正在运行。由于扩展,您可以调用和调用所有正常的API方法来操作捆绑包,注册服务等。例如FrameworkBundlegetBundleContext

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放在类路径上即可。


答案 2

这个线程可能有点陈旧,但无论如何...

Pax对maven urls有很好的支持,它甚至有一个包装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 处理程序安装这些内容,或者将它们放入自动部署目录中。

卡拉夫已经将这一切都内置到它的发行版中,所以也许看看卡拉夫发射器的来源?

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

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

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


推荐