2

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

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

我怎样才能做到这一点?

4

1 回答 1

1

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

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

 Object resource;

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


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

您在资源包中唯一需要做的就是注册一个服务,您可以使用激活器轻松完成该服务(激活器当然必须驻留在此包中)。或者,您可以使用 BundleTracker 编写扩展程序。您在清单中放置一个标头,然后在找到时注册一个提供资源的服务。最后,您当然也可以在已安装集中找到捆绑包并从那里读取资源。

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

于 2013-01-21T09:19:48.237 回答