用OSGi片段替换类/资源-片段中不包含jar就可以吗?

用OSGi片段替换类/资源-片段中不包含jar就可以吗?,osgi,osgi-fragment,Osgi,Osgi Fragment,我们希望通过添加OSGi片段来替换主机OSGi包中的某些资源 据我所知,OSGi片段中包含的资源只是添加到主机包的类路径中。 无法保证,如果片段正在添加已存在于主机捆绑包中的资源, 将加载片段中的资源:它也可能是主机版本 为了确保加载的是资源的片段版本而不是主机版本, 提到可以使用Bundle类路径头将资源指定为“first”(首选) 它以patch.jar为例: Bundle-ClassPath: patch.jar,. 如前所述:“由于patch.jar位于“.”之前,它将允许优先从片段而

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

据我所知,OSGi片段中包含的资源只是添加到主机包的类路径中。 无法保证,如果片段正在添加已存在于主机捆绑包中的资源, 将加载片段中的资源:它也可能是主机版本

为了确保加载的是资源的片段版本而不是主机版本, 提到可以使用Bundle类路径头将资源指定为“first”(首选)

它以patch.jar为例:

Bundle-ClassPath: patch.jar,.
如前所述:“由于patch.jar位于“.”之前,它将允许优先从片段而不是主机加载类

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


有没有一种方法可以优先从片段而不是主机加载类/资源,而不必在片段中包含jar?

好的,有两种方法可以实现您想要的。据我所知,在完成所有操作后,您希望从库包导出包,但补丁包中的包除外

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


另一种选择是使用maven bundle插件将补丁包和库包“隐藏”(合并)到一个新包中。只要补丁包和库包有不同的版本号,这也会起作用。许多博客会指示您使用maven shade插件和maven bundle插件来实现此选项,但它们是不正确的。您可以使用maven bundle插件执行着色处理。

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

对于那些仍在挣扎的类,以下是对我有效的确切步骤:

  • 使用要替换的资源/类创建片段项目

  • 在片段的build.properties中,更改
    source..=src/
    输出..=bin/
    source.patch/=src/
    output.patch/=bin/

  • 在片段的清单中,向bundle类路径添加
    patch/

  • 示例

    假设您有一个
    com.example.ui
    插件,其中有一个
    com.example.ui.MessageDialog
    类要替换

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

    • com.example.ui
      包中创建
      MessageDialog
      类(不是
      com.example.ui.fragment

    • 按如下方式编辑片段的build.properties文件:

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

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

      Bundle-ClassPath: patch/,.