我对osgi和bndtools非常陌生,但在过去的几天里,我已经成功地使用bind - ant任务创建了jar->包,并将我们的第三方jar包包装为包(对于那些还没有在manifest文件中定义'Export-Package'的人)。我必须评论一下,当涉及到导出和导入时,bndtools似乎做了所有繁重的工作,所以感谢您在这个项目上的辛勤工作!
我有两个问题,也许你可以解释一下:
<标题> 1我试图让bundle加载在felix和我立即运行到分辨率错误。在这个基本场景中,我们有一个名为omniquery_common的内部包,它使用几个第三方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版本,所以这应该满足它的依赖,但事实并非如此。
你能帮我理解一下我是怎么把这个接错的吗?
manifest for 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
manifest for 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 h1> 果我在"运行需求"列表中改变包的顺序,把gson包放在omniquery_common之前,我得到
Unable to resolve <<INITIAL>> version=null:
missing requirement Require[osgi.identity]{}{filter=(osgi.identity=com.google.gson)}
我觉得不直观-我本以为该列表中的捆绑顺序无关紧要…?
标题>标题>-runrequirements
列表中的需求顺序确实很重要,因为如果在列表的早期有错误,那么我们就不必费心尝试解决它下面的所有内容。也就是说:一旦知道解析不能成功,就退出并打印遇到的第一个错误。
您复制的第二条错误消息(当您将GSON需求放在首位时)表明您的存储库中根本没有GSON包。或者,它不在解析器可见的存储库中。过滤器(osgi.identity=com.google.gson)
失败,没有标识为com.google.gson
的资源
这也解释了来自您自己的omniquery_common
包的第一条错误消息。解析器找不到导出com.google.gson
包的任何包,如果GSON包不存在,这将是完全合理的。
因此,查看要解析的存储库及其索引包含的内容。如果GSON真的出现在那里,那么我将需要进一步的信息来找出问题。
顺便说一下,一旦你有这个工作,你应该不需要在-runrequirements
中显式列出GSON。这就是解析器的意义所在:我们将根据你使用的包找到你所有的依赖项。