如何使用maven构建OSGi包,其中包含来自OSGi片段的非代码资源



我有一个包含非代码资源的OSGi片段-它实际上是一个包含一组资源(图像文件等)的jar文件-我使用maven构建的。

我想用maven构建另一个依赖于资源片段的bundle。也就是说,当这个bundle中的代码被执行时,我希望从我的片段中加载资源,并通过Java的getResources()命令可用。

我该怎么做?

如果您使用bnd maven包插件构建,那么您可以只做com.example.resource,com.example.images。这将把maven类路径中的资源复制到您自己的jar中。如果您在某个已知的位置有片段,您还可以执行@resources/fragment.jar。@指令bind提取给定jar的内容,并将其包含在bundle中。

另一个解决方案是让你的bundle不是一个fragment,而是一个普通的bundle,并让它注册一个对象。在运行时,你得到这个服务,并执行getClass().getResource():

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

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

你需要在资源包中做的唯一一件事就是注册一个服务,你可以很容易地用一个激活器来完成(激活器当然必须驻留在这个bundle中)。或者,您可以使用BundleTracker编写一个扩展程序。在清单中放置一个标头,找到后注册一个提供资源的服务。最后,您当然也可以在安装集中找到bundle并从中读取资源。

一般来说,这些基于服务的解决方案比(不幸的是)更广为人知的类装入器"hack"要灵活得多。

最新更新