使用OSGi捆绑包嵌入依赖关系

时间:2018-05-14 22:26:12

标签: osgi osgi-bundle

我的OSGi应用程序需要一个jar(样本;版本= A),并且我将相同的jar(样本;版本= B)用于我开发的更新的包。

示例jar有一些增强功能,因此我无法升级现有的bundle以与version = B对齐。

我决定添加带有版本B的Sample作为嵌入式依赖项,因此我开发的较新的bundle引用了最新版本,而现有的bundle与版本A一起运行。不想让这两个版本运行 - 现在的时间。

<Embed-Directory>lib</Embed-Directory>
<Bundle-ClassPath>.,lib</Bundle-ClassPath>
<Import-Package>*</Import-Package>
<Embed-Dependency>sample;scope=compile|runtime</Embed-Dependency>

在运行时,始终只引用旧版本的示例(版本= A)。有没有一种方法可以通过bundle来引用嵌入式依赖项,而不是从运行时导出的包中获取?

Edit1:我也可以看到样本中的包是私有包的一部分。应用程序是否可以引用私有包,而不是引用OSGi容器提供的运行时包。

3 个答案:

答案 0 :(得分:2)

您必须从导入中排除软件包(例如!org.my.lib),然后它才会从bundleclasspath中获取它们。 您可以指示导入所需的所有包,也包括嵌入的包。

答案 1 :(得分:2)

虽然这是OSGI的替代方案,但将所有传递依赖项嵌入到大型包中是一种非常糟糕的做法。

如果只有一个bundle需要依赖项,那么你可以嵌入依赖项,它将在bundle中使用。否则将其作为OSGI包捆绑起来是最好的选择。

有时,我们可能需要管理相同依赖项的多个版本,在这种情况下,嵌入jar是唯一的选择。

如果您想嵌入相同依赖项的不同版本,那么您应该创建一个没有外部依赖关系的独立包(例如, Import-Package 应该在 MANIFEST中为空.MF )。

如果有以下情况,如果您还有外部依赖项和传递依赖项,则必须从旧版本的依赖项(在您的案例中为A版)中正确排除(否定)这些包。如下所示(如@ChristophLäubrich的回答所述),

<Import-Package>!com.test.*,*</Import-Package>

或单独导入缺少/必需的依赖项,而不是使用 Import-Package 中的(*)导入所有外部依赖项。像,

<Import-Package>com.abc.*</Import-Package>

在上面的pom.xml的片段中,您试图嵌入依赖项“sample”并尝试包含所有外部依赖项,其中包括(您的旧版本的示例)。这就是为什么它总是引用旧版本的依赖项,尽管你的bundle中嵌入了所需的依赖项。

参考:http://web.ist.utl.pt/ist162500/?p=1

答案 2 :(得分:0)

我在包A中添加了依赖项。如果我在pom中使用*; scope = compile | runtime,则使用依赖性的服务将变为活动状态,否则它将进入“满意”状态。