我有一个包含非代码资源的 OSGi 片段——它实际上是一个包含一组资源(图像文件等)的 jar 文件——我用 maven 构建的。
我想用 maven 构建另一个包,它依赖于带有资源的片段。也就是说,当这个包中的代码被执行时,我希望我的片段中的资源被加载并可以通过 Java 的 getResources() 命令获得。
我怎样才能做到这一点?
我有一个包含非代码资源的 OSGi 片段——它实际上是一个包含一组资源(图像文件等)的 jar 文件——我用 maven 构建的。
我想用 maven 构建另一个包,它依赖于带有资源的片段。也就是说,当这个包中的代码被执行时,我希望我的片段中的资源被加载并可以通过 Java 的 getResources() 命令获得。
我怎样才能做到这一点?
如果你使用 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”灵活得多。