(误)理解osgi bundle依赖

时间:2015-09-17 14:08:26

标签: java osgi apache-felix bndtools

我对osgi和bndtools很新,但在过去的几天里,我们设法使用bnd ant任务创建了jar->捆绑创建,并将我们的第三方jar包装成捆绑(对于那些尚未定义的人)清单文件中的“导出包”。我必须评论一下,对于出口和进口的所有繁重工作来说,bndtools看起来很棒,所以非常感谢你们对这个项目的辛勤工作!

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

1

我正在尝试在felix中加载捆绑包,并立即遇到解决方案错误。在这个基本场景中,我们有一个名为omniquery_common的内部捆绑包,它使用了几个第三方罐子,包括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)}

我发现不直观 - 我会认为该列表中的捆绑订单无关紧要......?

1 个答案:

答案 0 :(得分:0)

-runrequirements列表中的要求顺序很重要,因为如果列表中的某个早期出现错误,那么我们就不会尝试解决其下方的所有问题。那就是:一旦我们知道解决方案不能成功,我们只需退出并打印我们遇到的第一个错误。

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

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

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

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