![](/img/trans.png)
[英]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.