繁体   English   中英

如何在OSGi(Apache Felix)中注册服务?

[英]How do I register a service in OSGi (Apache Felix)?

我已经成功地通过代码启动了Apache Felix,并注册了一个自己的Bundle。

OSGI项目之间需要以下关系:

[OsgiInterface] -提供接口。

[OsgiModuleA] -(捆绑)提供了这些接口的实现。
知道[OsgiInterface]

[OsgiUsage] -使用一个或多个捆绑包。
知道[OsgiInterface][OsgiModuleA]

现在,我在注册实现接口的服务时遇到问题。 我猜想我在manifest.mf文件中的输入是错误的。

附加信息

如果有人可以看一下我上一个问题中的代码,那将非常好

让我参考这个问题:

我试图创建第三个项目OsgiInterfaces ,它在包interfaces提供一个接口SomeInterface OsgiModuleAOsgiUsage都知道该项目。

OsgiModuleA: manifest.mf现在具有用于条目Import-Package:附加值interfaces 此外,还有一个提供给激活器的SomeInterface实例。

启动捆绑包时,会发生NoClassDefFoundError :接口SomeInterface未知。

编辑:

现在,我可以确定错误已修复,最重要的部分是:

map.put(Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA,
    "my.interfaces; version=1.0.0");

没有这个,我得到了ClassCastException

以最基本的形式,服务以Java代码注册,而不使用清单或任何其他文件。 这通常发生在您的BundleActivator中。

Long      i     = new Long(20);    // the service implementation
Hashtable props = new Hashtable();
props.put("description", "This an long value");
bundleContext.registerService(Long.class.getName(), i, props);

我建议您阅读一本教程,例如Knopflerfish的教程。

一种替代方法是使用声明式服务或新的蓝图工具。 使用这些(或其他非标准化系统)中的任何一个,您都将在(通常为XML)文件中声明服务,而不是编写与服务注册表进行交互的代码。

但是您可能应该首先手动确定基础知识。

[OsgiUsage]-使用一个或多个捆绑包。 知道[OsgiInterface]和[OsgiModuleA]

使用服务的捆绑包不必知道提供它的捆绑包。 他们两个都只需要知道服务接口。 实际上,捆绑软件根本不需要了解其他捆绑软件。 他们只需要导入包,使用或提供服务即可。

我知道您在另一个捆绑软件中有SomeInterface ,对吗? 然后,您还必须在该软件包的清单中导出该软件包,例如。

Export-Bundle: interfaces

但是您真的应该看看另一个答案中提到的bnd工具。 这将生成标准的OSGi清单。

我建议您看一下iPOJO项目。 这使使用Felix更加容易。
https://felix.apache.org/documentation/subprojects/apache-felix-ipojo.html

我会说直接使用bndmaven-bundle-plugin创建启用OSGI的jar。

这比自己编写OSGI清单要容易(打字错误,错误,缺少进出口)

尝试以bnd为包装容器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM