簡體   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