使用OSGi捆绑包嵌入依赖项使用

使用OSGi捆绑包嵌入依赖项使用,osgi,osgi-bundle,Osgi,Osgi Bundle,我有一个OSGi应用程序所需的jar(示例;version=a),我必须将同一个jar(示例;version=B)用于我开发的新包 示例jar有一些增强功能,因此我不能仅仅升级现有的bundle以与version=B保持一致 我决定添加带有版本B的示例作为嵌入式依赖项,因此我开发的较新捆绑包引用最新版本,而现有捆绑包使用版本a运行。目前不希望同时运行这两个版本 <Embed-Directory>lib</Embed-Directory> <Bundle-ClassP

我有一个OSGi应用程序所需的jar(示例;version=a),我必须将同一个jar(示例;version=B)用于我开发的新包

示例jar有一些增强功能,因此我不能仅仅升级现有的bundle以与version=B保持一致

我决定添加带有版本B的示例作为嵌入式依赖项,因此我开发的较新捆绑包引用最新版本,而现有捆绑包使用版本a运行。目前不希望同时运行这两个版本

<Embed-Directory>lib</Embed-Directory>
<Bundle-ClassPath>.,lib</Bundle-ClassPath>
<Import-Package>*</Import-Package>
<Embed-Dependency>sample;scope=compile|runtime</Embed-Dependency>
lib
,lib
*
样品范围=编译|运行时
在运行时,始终只引用sample的旧版本(版本=A)。除了从运行时导出的包中获取外,是否有一种方法可以让包引用嵌入的依赖项


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

您必须从导入中排除这些包(例如!org.my.lib),然后它将仅从bundleclasspath中获取这些包。
在会议上,您指示导入所需的每个包,其中也包括嵌入的包。

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

如果只有一个bundle需要依赖项,那么您可以嵌入依赖项,并在bundle中与一起使用。否则,将其包装为OSGI包是最好的选择

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

如果要嵌入同一依赖项的不同版本,则应创建没有外部依赖项的独立捆绑包(即,导入包MANIFEST.MF中应为空)

如果您也有外部依赖项和可传递依赖项,则必须正确地从旧版本的依赖项(在您的情况下是版本A)中排除(否定)包。如下所示(如@Christoph Läubrich回答中所述)

!com.test.**
或者单独导入缺少的/必需的依赖项,而不是使用导入包中的(*)导入所有外部依赖项。像

<Import-Package>com.abc.*</Import-Package>
com.abc*
在上面pom.xml的代码片段中,您正在尝试嵌入依赖项“sample”,并尝试包含所有外部依赖项,其中包括(旧版本的sample)。这就是为什么它总是引用旧版本的依赖项,尽管您的包中嵌入了所需的依赖项


参考:

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

是,排除包并添加其他嵌入依赖项后,捆绑包将引用我自己的依赖项。谢谢,这很有帮助。!同意JAR的嵌入不符合OSGi最佳实践的要求,但仍需要针对特定用例进行嵌入。我排除了需要的bundle,并嵌入了一些其他需要的bundle,这样我就可以使我的bundle引用嵌入的依赖项。成功了。
<Import-Package>com.abc.*</Import-Package>