如何使用maven构建包含OSGi片段中非代码资源的OSGi包?
我有一个包含非代码资源的OSGi片段,它实际上是一个包含一组资源(图像文件等)的jar文件,是我用maven构建的 我想用maven构建另一个包,它依赖于包含资源的片段。也就是说,当执行此捆绑包中的代码时,我希望加载片段中的资源,并使用Java的getResources()命令提供这些资源如何使用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类路径复制到
我怎样才能做到这一点?如果您使用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();
...
}