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

2022-09-01 07:53:53

我有一个小捆绑包,使用Groovy来解释脚本。

清单导入包指令如下所示:

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]

导入已经消失了(当然,即使清单仍然有它)!现在,当我运行时,我得到了2.3.3,而不是1.8.6!groovy.utilGroovySystem.version

这是疯狂的东西,似乎只是一个新版本的Groovy存在的事实打破了OSGi的承诺,即我应该能够使用我想要的任何版本的依赖项。

我已经在Felix和Equinox中对此进行了测试,结果完全相同。

我还在清单中使用了确切的版本而不是范围,但这并没有改变任何东西。

有谁能看到这里到底发生了什么??

PS.如果你不相信我,试试你自己,这是GitHub上的项目:https://github.com/renatoathaydes/osgi-run/tree/next/osgi-run-test/ipojo-dosgi


答案 1

不要使用版本范围。显式设置 groovy.util 的版本 这可能看起来没有帮助,但我相信它会起作用。当我们尝试生成Karaf功能时,我们遇到了一个非常相似的问题.xml具有版本范围的依赖项上的文件(我们通过编写自己的插件来解决此问题,该插件从完成的功能文件:(中删除上层版本化项目)


答案 2

推荐