我的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的替代方案,但将所有传递依赖项嵌入到一个巨型包中是一种非常糟糕的做法。
如果只有一个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中嵌入了所需的依赖项。
您必须从导入中排除软件包(例如!org.my.lib),然后它将仅从bundleclasspath中获取它们。在您的指导下,您指示导入所需的所有包,也包括您的嵌入式包。
我在bundle A中添加了依赖..如果我在我的pom中使用*; scope = compile | runtime,那么正在使用依赖的服务变为活动状态,否则,它将进入满足状态。