Embed-Dependency 与 OSGi 包的使用

Embed-Dependency usage with OSGi bundles

我的 OSGi 应用程序需要一个 jar(sample;version=A),我必须将同一个 jar(sample;version=B) 用于我开发的新包。

示例 jar 有一些改进,所以我不能只升级现有的包以与版本=B 对齐。

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

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

在 运行 时,始终只引用旧版本的样本 (version=A)。与从 运行time 导出的包中获取相比,有没有一种方法可以使包引用嵌入式依赖项?

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

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

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

如果只有一个包需要依赖,那么你可以嵌入依赖,它会在包中使用。否则将其打包为 OSGI 包是最佳选择。

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

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

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

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

或单独导入 missing/required 依赖项,而不是使用 Import-Package 中的 (*) 导入所有外部依赖项。喜欢,

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

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

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

我在 bundle A 中添加了依赖项。如果我在我的 pom 中使用 *;scope=compile|runtime,那么使用依赖项的服务就会激活,否则,它将进入 Satisfied 状态。