如何使用maven构建包含OSGi片段中非代码资源的OSGi包?

如何使用maven构建包含OSGi片段中非代码资源的OSGi包?,maven,osgi,bnd,maven-bundle-plugin,Maven,Osgi,Bnd,Maven Bundle Plugin,我有一个包含非代码资源的OSGi片段,它实际上是一个包含一组资源(图像文件等)的jar文件,是我用maven构建的 我想用maven构建另一个包,它依赖于包含资源的片段。也就是说,当执行此捆绑包中的代码时,我希望加载片段中的资源,并使用Java的getResources()命令提供这些资源 我怎样才能做到这一点?如果您使用bnd maven bundle插件进行构建,那么只需执行com.example.resource、com.example.images即可。这将把资源从maven类路径复制到

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

我想用maven构建另一个包,它依赖于包含资源的片段。也就是说,当执行此捆绑包中的代码时,我希望加载片段中的资源,并使用Java的getResources()命令提供这些资源


我怎样才能做到这一点?

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

另一个解决方案是使包不是片段而是普通包,并让它注册一个对象。在运行时,您将获得此服务并从中执行getClass().getResource():

在资源包中,您需要做的唯一一件事就是注册一个服务,您可以使用activator轻松地完成这项工作(activator当然必须驻留在这个包中)。或者,您可以使用BundleTracker编写扩展程序。您在清单中放置了一个头,当发现时,您注册了一个提供资源的服务。最后,您当然也可以在已安装的集合中找到捆绑包并从中读取资源


一般来说,这些基于服务的解决方案比(不幸的是)更著名的类加载器“hacks”灵活得多。

只需将片段添加为可选依赖项?你读了吗
 Object resource;

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


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