【问题标题】:Embed-Dependency usage with OSGi bundles嵌入依赖与 OSGi 捆绑包的使用
【发布时间】:2018-10-24 16:14:28
【问题描述】:

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

示例 jar 具有一些增强功能,因此我不能只升级现有的捆绑包以与 version=B 对齐。

我决定将带有版本 B 的 Sample 添加为嵌入式依赖项,因此我开发的较新捆绑包指的是最新版本,而现有捆绑包使用版本 A 运行。不想将这两个版本都带到运行时瞬间。

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

在运行时,始终只引用旧版本的 sample(version=A)。有没有办法让包引用嵌入依赖项而不是从运行时导出的包中获取?

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

【问题讨论】:

    标签: osgi osgi-bundle


    【解决方案1】:

    我在捆绑包 A 中添加了依赖项。如果我在我的 pom 中使用 *;scope=compile|runtime,那么使用依赖项的服务将被激活,否则,它将进入满意状态。

    【讨论】:

      【解决方案2】:

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

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

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

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

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

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

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

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

      在上面 pom.xml 的 sn-p 中,您尝试嵌入依赖项“示例”并尝试包含所有外部依赖项,其中包括(您的旧版本示例)。这就是为什么它总是引用旧版本的依赖项,尽管您的包中嵌入了所需的依赖项。

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

      【讨论】:

      • 同意 jar 的嵌入违反 OSGi 最佳实践,但仍需要针对特定​​用例执行此操作。我排除了需要的包并嵌入了一些其他需要的包,这样我可以让我的包引用嵌入的依赖项。它奏效了。
      【解决方案3】:

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

      【讨论】:

      • 是的,在排除包并添加其他嵌入式依赖项之后,捆绑包引用了我自己的依赖项。谢谢它的帮助。!
      猜你喜欢
      • 2014-11-20
      • 2015-10-04
      • 2017-09-10
      • 2022-01-23
      • 2015-03-12
      • 2015-12-14
      • 2018-08-23
      • 2013-11-02
      • 2013-02-28
      相关资源
      最近更新 更多