我们希望通过添加OSGi片段来替换主机OSGi包中的某些资源。
据我了解,OSGi片段中包含的资源仅添加到主机包的类路径中。 如果片段正在添加主机包中已存在的资源,则无法保证 将加载片段中的资源:它仍然可以是主机版本。
为了确保加载资源的片段版本而不是主机版本, http://wiki.osgi.org/wiki/Fragment提到可以使用Bundle-ClassPath标头将资源指定为“first”(首选)。
它以patch.jar为例:
Bundle-ClassPath: patch.jar,.
如上所述:“因为patch.jar领先于'。'它将允许从片段而不是主机中优先加载类。“
我可以使用这种技术,但这意味着我首先必须将我的片段资源捆绑在一个单独的jar中,然后将这个jar包含在片段包中。
有没有办法优先从片段而不是主机加载类/资源而不必在片段中包含jar?
答案 0 :(得分:4)
您不必包含jar。您可以使用“patch”目录,然后将您的类放在片段中的补丁目录中。
答案 1 :(得分:1)
好的,有几种方法可以达到你想要的效果。根据我的理解,在完成所有工作后,您希望从库包中导出包,除了位于修补程序包中的包之外。
要实现此目的,请在库包的Manifest.MF中指定要导出的显式包而不是“。”。您可以使用片段执行此操作,这样您就不必修改原始包。然后,对您的补丁包执行相同的操作。
另一个选择是使用maven-bundle-plugin将修补程序包和库包“一起”“合并”(合并)到一个新的包中。只要补丁包和他的库包具有不同的版本号,这也将起作用。许多博客都会指示你使用maven-shade-plugin和maven-bundle-plugin这个选项,但它们是不正确的。您可以使用maven-bundle-plugin明确执行着色。
答案 2 :(得分:1)
对于那些仍在努力的人来说,这些是对我有用的确切步骤:
使用要替换的资源/类创建一个片段项目
在片段的build.properties中,将source.. = src/
和output.. = bin/
更改为source.patch/ = src/
和output.patch/ = bin/
在片段的清单中,将patch/
添加到包类路径
示例强>:
假设您有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/,.