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

问题描述 投票:2回答:3

我的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容器给出的运行时包。

osgi osgi-bundle
3个回答
2
投票

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

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

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

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

如果有的话,如果你有外部依赖关系和传递依赖关系,你必须从旧版本的依赖项(在你的情况下为版本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
投票

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


0
投票

我在bundle A中添加了依赖..如果我在我的pom中使用*; scope = compile | runtime,那么正在使用依赖的服务变为活动状态,否则,它将进入满足状态。

© www.soinside.com 2019 - 2024. All rights reserved.