我有一个使用Groovy来解释脚本的小包.
清单Import-Package指令如下所示:
Import-Package: groovy.util;version="[1.8,2)"
Run Code Online (Sandbox Code Playgroud)
上面的版本范围明确指出导入版本必须介于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]
Run Code Online (Sandbox Code Playgroud)
这正是我所期望的,当我要求CodeRunner解释这个Groovy片段时:
GroovySystem.version
Run Code Online (Sandbox Code Playgroud)
它正确返回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]
Run Code Online (Sandbox Code Playgroud)
该groovy.util进口消失(即使清单仍然有它,当然)!现在,当我跑步时,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
不要使用版本范围。显式设置 groovy.util 的版本这可能看起来没有帮助,但我相信它会起作用。当我们尝试根据版本范围的依赖项生成 Karaf features.xml 文件时,我们遇到了非常相似的问题(我们通过编写自己的插件来解决这个问题,该插件从完成的功能文件中删除了较高版本的项目:( )