我的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容器提供的运行时包。
答案 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中嵌入了所需的依赖项。
答案 2 :(得分:0)
我在包A中添加了依赖项。如果我在pom中使用*; scope = compile | runtime,则使用依赖性的服务将变为活动状态,否则它将进入“满意”状态。