用OSGi片段替换类/资源-片段中不包含jar就可以吗?
我们希望通过添加OSGi片段来替换主机OSGi包中的某些资源 据我所知,OSGi片段中包含的资源只是添加到主机包的类路径中。 无法保证,如果片段正在添加已存在于主机捆绑包中的资源, 将加载片段中的资源:它也可能是主机版本 为了确保加载的是资源的片段版本而不是主机版本, 提到可以使用Bundle类路径头将资源指定为“first”(首选) 它以patch.jar为例:用OSGi片段替换类/资源-片段中不包含jar就可以吗?,osgi,osgi-fragment,Osgi,Osgi Fragment,我们希望通过添加OSGi片段来替换主机OSGi包中的某些资源 据我所知,OSGi片段中包含的资源只是添加到主机包的类路径中。 无法保证,如果片段正在添加已存在于主机捆绑包中的资源, 将加载片段中的资源:它也可能是主机版本 为了确保加载的是资源的片段版本而不是主机版本, 提到可以使用Bundle类路径头将资源指定为“first”(首选) 它以patch.jar为例: Bundle-ClassPath: patch.jar,. 如前所述:“由于patch.jar位于“.”之前,它将允许优先从片段而
Bundle-ClassPath: patch.jar,.
如前所述:“由于patch.jar位于“.”之前,它将允许优先从片段而不是主机加载类
我可以使用这种技术,但这意味着我首先必须将我的片段资源捆绑在一个单独的jar中,然后将这个jar包含在片段捆绑包中
有没有一种方法可以优先从片段而不是主机加载类/资源,而不必在片段中包含jar?好的,有两种方法可以实现您想要的。据我所知,在完成所有操作后,您希望从库包导出包,但补丁包中的包除外 为此,请在库捆绑包的Manifest.MF中指定要导出的显式包,而不是“.”。您可以使用片段执行此操作,这样就不必修改原始捆绑包。然后,对您的补丁包执行相同的操作
另一种选择是使用maven bundle插件将补丁包和库包“隐藏”(合并)到一个新包中。只要补丁包和库包有不同的版本号,这也会起作用。许多博客会指示您使用maven shade插件和maven bundle插件来实现此选项,但它们是不正确的。您可以使用maven bundle插件执行着色处理。您不必包括jar。您可以改为使用“补丁”目录,然后将您的类放在片段中的补丁目录中。对于那些仍在挣扎的类,以下是对我有效的确切步骤:
source..=src/
和输出..=bin/
到source.patch/=src/
和output.patch/=bin/
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/,.