【问题标题】:(mis)understanding osgi bundle dependencies(错误)理解 osgi 捆绑包依赖项
【发布时间】:2015-12-14 10:44:17
【问题描述】:

我对 osgi 和 bndtools 还很陌生,但在过去的几天里,我设法使用 bnd ant 任务创建了 jar->bundle 创建工作,并将我们的 3rd 方 jar 包装为 bundle(对于那些尚未定义清单文件中的“导出包”)。我必须评论说,bndtools 在导出和导入方面完成所有繁重的工作似乎很棒,所以感谢您在这个项目上的辛勤工作!

我有两个问题,也许你可以解释一下:

1

我正在尝试将捆绑包加载到 felix 中,但我立即遇到了解析错误。在这个基本场景中,我们有一个名为 omniquery_common 的内部包,它使用了几个 3rd 方 jar,包括 gson。当我解决我得到这个:

Unable to resolve <<INITIAL>> version=null:
   missing requirement Require[osgi.identity]{}{filter=(osgi.identity=omniquery_common)} [caused by:
   Unable to resolve omniquery_common version=1.0.0.0:
   missing requirement Require[osgi.wiring.package]{}{filter=(&(osgi.wiring.package=com.google.gson)(version>=2.2.0)(!(version>=3.0.0)))}]

对我来说,omniquery_common 正在导入 com.google.gson(版本至少为 2.2 且低于 3.0)。 gson 包正在导出版本 2.2.4,所以这应该满足它的依赖关系,但不是。

你能帮我理解我是怎么弄错的吗?

omniquery_common 的清单:

Manifest-Version: 1.0
Bnd-LastModified: 1442336803995
Bundle-ManifestVersion: 2
Bundle-Name: omniquery_common
Bundle-SymbolicName: omniquery_common
Bundle-Version: 1.0.0.0
Created-By: 1.8.0_40 (Oracle Corporation)
Export-Package: com.radian6.omni.common.osgi;version="1.0.0"
Import-Package: com.google.gson;version="[2.2,3)",com.radian6.omni.commo
 n.util,org.apache.commons.io;version="[1.4,2)",org.apache.commons.lang;
 version="[2.6,3)",org.junit
Private-Package: com.radian6.omni.common.core
Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.7))"
Tool: Bnd-2.4.1.201501161923

gson 的清单:

Manifest-Version: 1.0
Export-Package: com.google.gson;version=2.2.4, com.google.gson.annotat
 ions;version=2.2.4, com.google.gson.reflect;version=2.2.4, com.google
 .gson.stream;version=2.2.4, com.google.gson.internal;version=2.2.4, c
 om.google.gson.internal.bind;version=2.2.4
Bundle-ClassPath: .
Built-By: inder
Bundle-Name: Gson
Created-By: Apache Maven 3.0.4
Bundle-RequiredExecutionEnvironment: J2SE-1.5
Bundle-Vendor: Google Gson Project
Bundle-ContactAddress: http://code.google.com/p/google-gson/
Bundle-Version: 2.2.4
Build-Jdk: 1.7.0_21
Bundle-ManifestVersion: 2
Bundle-Description: Google Gson library
Bundle-SymbolicName: com.google.gson
Archiver-Version: Plexus Archiver

2

如果我在“运行要求”列表中更改捆绑包的顺序,将 gson 捆绑包放在omniquery_common 之前,我会得到

Unable to resolve <<INITIAL>> version=null:
   missing requirement Require[osgi.identity]{}{filter=(osgi.identity=com.google.gson)}

我觉得不直观 - 我会认为该列表中的捆绑顺序无关紧要...?

【问题讨论】:

    标签: java osgi apache-felix bndtools


    【解决方案1】:

    -runrequirements 列表中要求的顺序确实很重要,因为如果列表中的早期出现错误,那么我们不会费心尝试解决它下面的所有问题。即:一旦我们知道解析无法成功,我们就直接退出并打印我们遇到的第一个错误。

    您复制的第二条错误消息(当您首先提出 GSON 要求时)表明您的存储库中根本没有 GSON 捆绑包。或者,它不在解析器可见的存储库中。过滤器(osgi.identity=com.google.gson) 失败,这意味着没有标识为com.google.gson 的资源。

    这也将解释来自您自己的omniquery_common 包的第一条错误消息。解析器找不到任何导出包 com.google.gson 的包,如果 GSON 包不存在,这将非常有意义。

    因此,请查看您正在解析的存储库及其索引包含的内容。如果 GSON 确实出现在那里,那么我将需要更多信息来找出问题所在。

    顺便说一句,一旦你完成了这项工作,你根本不需要在-runrequirements 中明确列出 GSON。这就是解析器的重点:我们将根据您使用的包找到您的所有依赖项。

    【讨论】:

    • 好吧,从这个意义上说,这对于运行需求是有意义的,但我想我在某处读到 osgi 允许循环依赖。这种“短路”不会阻止这种情况吗?
    • 无论如何,我意识到我一直在创建单独的运行描述符。一旦我删除了这些并使用了默认的 bnd.bnd 文件(起初并没有意识到你可以将运行描述符放在那里),事情就开始工作了。但是,我仍然需要将包放在“运行要求”中,因为它似乎没有自动解析依赖项。无论如何,我的基本设置工作正常,BundleActivator 开始了。谢谢尼尔!
    • 是的,OSGi 允许循环依赖。我不明白这有什么关系......这里的循环依赖在哪里?你只是有一个完全不存在的捆绑包。
    • 是的,这里绝对没有 circ dep - 只是你关于短路的声明让它听起来好像它还没有找到它快速失败的依赖关系。在 circ dep 的情况下,您可能需要先到达列表的末尾,然后才能在您的 circ dep 中找到另一个捆绑包,并且短路听起来会阻止完整遍历运行需求。这有意义吗?
    • 顶级需求列表并不真正相关,因为您可以在这些需求的任何第 n 级依赖项中获得一个循环。解析器只需记住它已经访问过的资源即可处理它们。无论如何,我没有写解析器,但我知道它有效,所以我很高兴。
    猜你喜欢
    • 2015-10-04
    • 2015-03-12
    • 2017-09-10
    • 2022-01-23
    • 2014-11-20
    • 2013-11-02
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    相关资源
    最近更新 更多