[英]How to call service Bundle in your application with 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
。 OsgiModuleA和OsgiUsage都知道该项目。
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.