用OSGi片段替换类/资源 - 可能没有在片段中包含jar?

时间:2014-01-20 11:12:31

标签: osgi osgi-fragment

我们希望通过添加OSGi片段来替换主机OSGi包中的某些资源。

据我了解,OSGi片段中包含的资源仅添加到主机包的类路径中。 如果片段正在添加主机包中已存在的资源,则无法保证 将加载片段中的资源:它仍然可以是主机版本。

为了确保加载资源的片段版本而不是主机版本, http://wiki.osgi.org/wiki/Fragment提到可以使用Bundle-ClassPath标头将资源指定为“first”(首选)。

它以patch.jar为例:

Bundle-ClassPath: patch.jar,.

如上所述:“因为patch.jar领先于'。'它将允许从片段而不是主机中优先加载类。“

我可以使用这种技术,但这意味着我首先必须将我的片段资源捆绑在一个单独的jar中,然后将这个jar包含在片段包中。

有没有办法优先从片段而不是主机加载类/资源而不必在片段中包含jar?

3 个答案:

答案 0 :(得分:4)

您不必包含jar。您可以使用“patch”目录,然后将您的类放在片段中的补丁目录中。

答案 1 :(得分:1)

好的,有几种方法可以达到你想要的效果。根据我的理解,在完成所有工作后,您希望从库包中导出包,除了位于修补程序包中的包之外。

要实现此目的,请在库包的Manifest.MF中指定要导出的显式包而不是“。”。您可以使用片段执行此操作,这样您就不必修改原始包。然后,对您的补丁包执行相同的操作。

另一个选择是使用maven-bundle-plugin将修补程序包和库包“一起”“合并”(合并)到一个新的包中。只要补丁包和他的库包具有不同的版本号,这也将起作用。许多博客都会指示你使用maven-shade-plugin和maven-bundle-plugin这个选项,但它们是不正确的。您可以使用maven-bundle-plugin明确执行着色。

答案 2 :(得分:1)

对于那些仍在努力的人来说,这些是对我有用的确切步骤:

  1. 使用要替换的资源/类创建一个片段项目

  2. 在片段的build.properties中,将source.. = src/output.. = bin/更改为source.patch/ = src/output.patch/ = bin/

  3. 在片段的清单中,将patch/添加到包类路径

  4. 示例

    假设您有com.example.ui插件,其中包含您要替换的com.example.ui.MessageDialog类。

    • 创建片段项目com.example.ui.fragment

    • MessageDialog包中创建com.example.ui课程(不是com.example.ui.fragment);

    • 编辑片段的build.properties文件,如下所示:

      source.patch/ = src/
      output.patch/ = bin/
      
    • 在片段的清单中添加:

      Bundle-ClassPath: patch/
      
    • com.example.ui清单中更改包类路径:

      Bundle-ClassPath: patch/,.