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

时间:2013-01-21 04:00:47

标签: maven osgi bnd maven-bundle-plugin

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

我想用maven构建另一个bundle,它依赖于带有资源的片段。也就是说,当执行此包中的代码时,我希望使用Java的getResources()命令加载我的片段中的资源并使其可用。

我该怎么做?

1 个答案:

答案 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编写扩展程序。您在清单中放置了一个标题,当您找到注册提供资源的服务时。最后,您当然也可以在已安装的集合中找到该捆绑包并从那里读取资源。

一般来说,这些基于服务的解决方案比(不幸的)更知名的类加载器'黑客'更灵活。