2013-01-21 86 views
2

我有一個包含非代碼資源的OSGi片段 - 這實際上是一個包含一組資源(圖像文件等)的jar文件 - 我使用maven構建的。如何使用包含來自OSGi片段的非代碼資源的maven構建OSGi包?

我想用maven構建另一個捆綁包,它依賴於具有資源的碎片。也就是說,當這個包中的代碼被執行時,我希望我的片段中的資源被加載,並且可以通過Java的getResources()命令使用。

我怎樣才能做到這一點?

+0

只需添加片段作爲可選的依賴項?你讀過http://stackoverflow.com/questions/11029768/when-is-an-osgi-fragment-attached-to-host – SpaceTrucker

回答

1

如果使用bnd maven bundle插件進行構建,則只需執行com.example.resource,com.example.images即可。這會將資源從maven classpath複製到你自己的jar中。如果你在某個已知的地方有片段,你也可以做@ resources/fragment.jar。 @指示bnd提取給定jar的內容並將其包含在包中。

另一種解決方案是讓你的包不是一個片段而是一個普通包,讓它註冊一個對象。在運行時,你從它那裏得到這種服務,做的getClass()的getResource():

Object resource; 

@Reference(target="resource=myresource") 
void setObject(Object o) { 
    this.resource = o; 
} 


void foo() { 
     URL u = resource.getClass().getResource(); 
     ... 
} 

需要在資源包做的唯一一件事就是註冊一個服務,你可以很容易地與活化劑做(激活器當然必須駐留在這個包中)。或者,您可以使用BundleTracker編寫擴展器。您在清單中放入一個頭文件,找到後註冊一個提供資源的服務。最後,您當然也可以在已安裝的設備中找到該軟件包,並從那裏讀取資源。一般來說,這些基於服務的解決方案比(不幸的)更加着名的類加載器'黑客'更加靈活。