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

Posted

技术标签:

【中文标题】在我的 OSGi 环境中安装新版本的 Groovy 会使我的包导入它,尽管它不应该【英文标题】:Installing a new version of Groovy on my OSGi environment makes my bundle import it, though it shouldn't 【发布时间】:2014-10-03 16:11:58 【问题描述】:

我有一个使用 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 sn-p 时:

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 导入消失了(当然,即使清单仍然有它)!现在,当我运行 GroovySystem.version 时,我得到的是 2.3.3,而不是应该的 1.8.6!

这太疯狂了,似乎新版本的 Groovy 的出现打破了 OSGi 的承诺,即我应该能够使用我想要的任何版本的依赖项。

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

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

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

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

【问题讨论】:

我检查了项目并快速浏览了一下,但 gradle 在查找 ipojo 插件时遇到了问题。也许您可以添加一些构建捆绑包的说明?你检查过罐子里实际的 MANIFEST.MF 吗? 嗨。 ipojo-plugin 在 JCenter 上可用,您需要将 jCenter() 存储库添加到 builscript 存储库列表(请参阅github.com/renatoathaydes/osgi-run/tree/next/ipojo-plugin)。我检查了 MANIFEST.MF,是的。我总是看着它,因为我希望这是实际 OSGi 环境的唯一信息来源……但就我而言,似乎还有其他事情发生。 你试过 [1.8,2.0) 作为版本范围吗? 您是否看到两个依赖项都安装在您的 OSGI 容器中?您的日志中是否有任何错误? 【参考方案1】:

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

【讨论】:

嗨,感谢您的回答,但我在问题中提到,接近尾声时,我尝试在清单中使用精确版本,但它不起作用。一旦有不少人支持这个问题,我会尽快回复这个问题,所以似乎有一些兴趣(我之前已经获得了这个问题的模糊问题徽章!)

以上是关于在我的 OSGi 环境中安装新版本的 Groovy 会使我的包导入它,尽管它不应该的主要内容,如果未能解决你的问题,请参考以下文章

尝试在我的 Anaconda 环境中安装 wptools 以在 Jupyter 中使用

在 Eclipse 中安装东西 - 找不到存储库“osgi.bundle”

无法在 Windows 中安装 mysql-python(较新版本)

在 Apache Felix OSGI 中安装和运行 Web 管理控制台

无法在 Jenkins 中安装 Groovy 插件

如果我安装新版本的 Python,是不是应该重新安装每个模块?