【问题标题】: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”灵活得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-18
    • 2019-11-21
    • 2014-03-12
    • 1970-01-01
    • 2010-11-27
    • 2023-04-07
    • 2018-02-12
    • 2016-07-22
    相关资源
    最近更新 更多