在我的OSGi环境中安装新版本的Groovy会使我的包导入,尽pipe它不应该
我有一些使用Groovy来解释脚本的包。
清单Import-Package指令看起来像这样:
Import-Package: groovy.util;version="[1.8,2)"
上面的版本范围清楚地表明,导入版本必须在1.8(含)和2.0(含)之间。
当我在只安装了Groovy 1.8.6的OSGi环境中运行这个包时,它按预期工作…当我inputinspect 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
导入消失了(尽pipeMANIFEST仍然有它,当然)! 而现在,当我运行GroovySystem.version
我获得了2.3.3,而不是1.8.6!
这是疯狂的东西,它似乎只是一个新的版本的Groovy的事实是打破了OSGi的承诺,我应该能够使用任何版本的依赖我想要的。
我已经在Felix和Equinox中testing了这个结果。
我也在清单中使用了一个精确的版本,而不是一个范围,但是这并没有改变任何东西。
任何人都可以看到究竟是怎么回事?
PS。 如果你不相信我,试试下面的GitHub项目: https : //github.com/renatoathaydes/osgi-run/tree/next/osgi-run-test/ipojo-dosgi
不要使用版本范围。 明确设置groovy.util的版本这似乎没有帮助,但我相信它会起作用。 当我们尝试生成与版本范围相关的Karaf features.xml文件时,我们遇到了一个非常类似的问题(我们通过编写我们自己的插件从完成的特性文件中删除了高版本的项目:()