【问题标题】:Importing resources from OSGi bundle从 OSGi 包中导入资源
【发布时间】:2011-11-25 17:38:15
【问题描述】:

使用 OSGi 中的导入机制,可以直接从另一个包中导入包。但是,我未能成功导入存在于包“根”中的资源。

是否可以将不在包范围内的资源导入另一个包?

我想要实现的是:

Bundle A 在“根目录”中有一个文件资源

Bundle B 导入 bundle A:s 包和资源。 通过 bundle B:s ClassLoader,我希望能够加载 bundle A 中的资源,就好像它存在于 Bundle B 中一样。

【问题讨论】:

标签: java osgi bundle


【解决方案1】:

创建一个新线程,然后创建一个指向所需文件的新类加载器。

看看这个片段:

ClassLoader c = new URLClassLoader(urls);
thread.setContextClassLoader(c);

线程类加载器将能够加载包中的文件,其中 URL 包含包的绝对位置。

【讨论】:

    【解决方案2】:

    bundle 根目录中的资源位于“默认”包中,无法导入或导出。

    如果您确实必须通过类加载器访问资源,则需要将它们移动到一个包中并导出该包。否则,您可以使用Bundle.getEntry() 从任何捆绑包的任何位置读取资源。

    【讨论】:

    • 谢谢尼尔,这正是我需要知道的!
    • FWIW,我已经实现了一个解决方法,在加载资源时简单地尝试两个 ClassLoader。
    【解决方案3】:

    您可以使用 OSGi 片段包。对于您的情况:捆绑 B 是主机,捆绑 A 是捆绑 B 的片段。但是捆绑 B 可以访问捆绑 A 的所有类和资源(文件夹)。

    OSGi 核心规范 #3.13 片段包中的更多详细信息

    【讨论】:

    • Dmitry,不幸的是,这两个包都是现有的 jar,我将它们包装为包,如果我理解正确,片段只能附加到单个包(并且它需要连接到多个包)。
    • Christer,您可以使用 Bundle#findEntries() 和 Bundle#getEntry() 方法获取捆绑资源。
    猜你喜欢
    • 2012-07-30
    • 2010-11-27
    • 2023-03-12
    • 2012-09-13
    • 1970-01-01
    • 2017-04-07
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多