在我的OSGi环境中安装新版本的Groovy会使我的bundle导入它,尽管它不应该

时间:2014-08-10 21:03:47

标签: java groovy osgi

我有一个使用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

1 个答案:

答案 0 :(得分:1)

请勿使用版本范围。明确设置groovy.util的版本 这似乎没有用,但我相信它会奏效。当我们尝试在版本范围的依赖项上生成Karaf features.xml文件时,我们遇到了一个非常类似的问题(我们通过编写我们自己的插件来解决这个问题,该插件从已完成的功能文件中删除了上层版本的项目:()