我有一个包含非代码资源的OSGi片段 - 实际上是一个包含一组资源(图像文件等)的jar文件 - 我用maven构建。
我想用maven构建另一个bundle,它依赖于带有资源的片段。也就是说,当执行此包中的代码时,我希望使用Java的getResources()命令加载我的片段中的资源并使其可用。
我该怎么做?
答案 0 :(得分:1)
如果使用bnd maven bundle插件构建,那么只需执行com.example.resource,com.example.images即可。这会将maven类路径中的资源复制到您自己的jar中。如果你在某个已知的地方有片段,你也可以做@ resources / fragment.jar。 @指示bnd提取给定jar的内容并将其包含在bundle中。
另一种解决方案是使您的包不是片段而是普通包,并让它注册一个对象。在运行时,您将获得此服务并从中执行getClass()。getResource():
Object resource;
@Reference(target="resource=myresource")
void setObject(Object o) {
this.resource = o;
}
void foo() {
URL u = resource.getClass().getResource();
...
}
您在资源包中唯一需要做的就是注册一个服务,您可以轻松地使用激活器(激活器当然必须驻留在此捆绑包中)。或者,您可以使用BundleTracker编写扩展程序。您在清单中放置了一个标题,当您找到注册提供资源的服务时。最后,您当然也可以在已安装的集合中找到该捆绑包并从那里读取资源。
一般来说,这些基于服务的解决方案比(不幸的)更知名的类加载器'黑客'更灵活。