【问题标题】:How can I build a OSGi bundle with maven that includes non-code resources from an OSGi fragment?如何使用包含来自 OSGi 片段的非代码资源的 maven 构建 OSGi 包?
【发布时间】:2013-01-04 03:16:12
【问题描述】:
我有一个包含非代码资源的 OSGi 片段——实际上是一个包含一组资源(图像文件等)的 jar 文件——我用 maven 构建的。
我想用 maven 构建另一个包,它依赖于带有资源的片段。也就是说,当这个包中的代码被执行时,我希望我的片段中的资源能够通过 Java 的 getResources() 命令加载并可用。
我该怎么做?
【问题讨论】:
标签:
maven
osgi
bnd
maven-bundle-plugin
【解决方案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”灵活得多。