我有一个使用Groovy来解释脚本的小包。
清单Import-Package指令如下所示:
Import-Package: groovy.util;version="[1.8,2)"
上述版本范围明确指出导入版本必须介于1.8(含)和2.0(不含)之间。
当我在仅安装了Groovy 1.8.6的OSGi环境中运行此捆绑包时,它按预期工作...当我键入inspect package requirement 4
时,它会打印:
-> com.athaydes.gradle.osgi.groovy-1-8-6-runner [4] imports packages:
------------------------------------------------------------------
ipojo.example.code; version=0.0.0 -> com.athaydes.gradle.osgi.code-runner-api [1]
groovy.util; version=1.8.6 -> groovy-all [5]
这完全符合我的预期,当我要求CodeRunner解释这个Groovy片段时:
GroovySystem.version
它正确返回1.8.6
。
现在,当我启动安装了Groovy 1.8.6和2.3.3的OSGi环境时,当我检查包的包时,我得到了这个:
-> com.athaydes.gradle.osgi.groovy-1-8-6-runner [4] imports packages:
------------------------------------------------------------------
ipojo.example.code; version=0.0.0 -> com.athaydes.gradle.osgi.code-runner-api [1]
groovy.util
导入消失了(尽管MANIFEST仍然拥有它,当然)!现在,当我运行GroovySystem.version
时,我得到2.3.3,而不是1.8.6!
这是一个疯狂的东西,似乎只是一个新版本的Groovy存在的事实打破了OSGi的承诺,我应该能够使用我想要的任何版本的依赖。
我在Felix和Equinox中对此进行了测试,结果完全相同。
我还在清单中使用了精确版本而不是范围,但这并未改变任何内容。
谁能看到这里到底发生了什么?
PS。如果你不相信我,试一试自己,这是GitHub上的项目:https://github.com/renatoathaydes/osgi-run/tree/next/osgi-run-test/ipojo-dosgi
答案 0 :(得分:1)
请勿使用版本范围。明确设置groovy.util的版本 这似乎没有用,但我相信它会奏效。当我们尝试在版本范围的依赖项上生成Karaf features.xml文件时,我们遇到了一个非常类似的问题(我们通过编写我们自己的插件来解决这个问题,该插件从已完成的功能文件中删除了上层版本的项目:()