【问题标题】:Replacing classes/resources with an OSGi fragment - possible without including a jar in the fragment?用 OSGi 片段替换类/资源 - 可能不包括片段中的 jar?
【发布时间】:2014-01-20 11:12:30
【问题描述】:

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

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

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

以patch.jar为例:

Bundle-ClassPath: patch.jar,.

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

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

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

【问题讨论】:

    标签: osgi osgi-fragment


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      另一种选择是使用 maven-bundle-plugin 将补丁包和库包“遮蔽”(合并)到一个新包中。只要补丁包和库包的版本号不同,这也可以。许多博客会指导您使用 maven-shade-plugin 和 maven-bundle-plugin 来实现此选项,但它们是不正确的。您绝对可以使用 maven-bundle-plugin 执行着色。

      【讨论】:

        【解决方案3】:

        对于那些仍在苦苦挣扎的人,这些是对我有用的确切步骤:

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

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

        3. 在片段的清单中,将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/,. 
          

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-04-21
          • 2011-08-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-04
          相关资源
          最近更新 更多