如何避免 karaf 加载默认解析包

how to avoid karaf load the default resolve bundle

我将 karaf 用于 运行 一个使用内置 commons-lang3 的 OSGI 包。5.jar。

问题是当我 运行 这个包时,karaf 会自动加载另一个 commons-lang3.1.jar。我不确定它什么时候加载。但这需要我的包崩溃。

有什么方法可以卸载 karaf 默认内置包吗?

不,不要 "uninstall" 默认内置包,因为它已被其他人使用。 确保你自己的 bundle 对 commons lang bundle 进行了干净的导入。

bnd 指令如下所示:

import-package:
   org.apache.commons.lang;version="[3.5,4.0)", \
   *

如果有比您自己已经包含的版本更好的可用版本,您可以确保仅导入 commons lang。

提示,不要嵌入依赖项,但要确保依赖可重用的依赖项。使用此类导入包,您可以确保依赖于特定版本。

正如 Achim 所说,不要卸载默认包,但请指定您所需的版本范围。但是,我建议您不要使用正常的 OSGI 版本范围,而是指定 [3.5.0,3.5.0].

目前,最安全的做法是仅使用点版本导入 COMMONS 包,或者使用从您使用 bnd 基线或类似工具确定与您的代码兼容的最低版本开始的版本范围,并结束在您正在构建的版本的完整版本号中。

例如,忽略所有次要版本: 在 commons-lang 的 3.03.1 版本之间,唯一报告的基线 api 变化是两个包中的未成年人: org.apache.commons.lang3org.apache.commons.lang3.exception

但是,所有包都被提升到 3.1.0

3.13.2 之间,对几个软件包进行了细微更改:对 org.apache.commons.lang3 的第二次细微更改,以及对 org.apache.commons.lang3.reflectorg.apache.commons.lang3.textorg.apache.commons.lang3.text.translateorg.apache.commons.lang3.tuple

但是,主要 更改为 org.apache.commons.lang3.time

同样,所有包版本都设置为 3.2.0,除了现在包版本没有过度限制,现在有一个隐藏的重大更改。

换句话说:根据基线检测到的更改,将声明的导出包版本与更多 "accurate" 包版本进行比较,我们有以下内容。

请注意,对于仅进行了细微更改的软件包,"accurate" 软件包版本号反映了对该软件包进行了细微更改的版本数量,而不是任何特定版本的软件包编号。

  Package                                | "Accurate" | Declared 
------------------------------------------------------------------              
= org.apache.commons.lang3               | 3.2.0      | 3.2.0 
+ org.apache.commons.lang3.builder       | 3.0.0      | 3.2.0
+ org.apache.commons.lang3.concurrent    | 3.0.0      | 3.2.0
+ org.apache.commons.lang3.event         | 3.0.0      | 3.2.0
+ org.apache.commons.lang3.exception     | 3.1.0      | 3.2.0
+ org.apache.commons.lang3.math          | 3.0.0      | 3.2.0
+ org.apache.commons.lang3.mutable       | 3.0.0      | 3.2.0 
+ org.apache.commons.lang3.reflect       | 3.1.0      | 3.2.0
+ org.apache.commons.lang3.text          | 3.1.0      | 3.2.0
+ org.apache.commons.lang3.text.translate| 3.1.0      | 3.2.0
* org.apache.commons.lang3.time          | 4.0.0      | 3.2.0
+ org.apache.commons.lang3.tuple         | 3.1.0      | 3.2.0

包号为"correct"1包,10包太保守,1包错误。 如果我们一直遵循该模式到 3.5,这将保持不变(在 3.4 和 3.5 之间对时间包进行了第二次隐藏的重大更改:

Package                                  | "Accurate" | Declared 
------------------------------------------------------------------              
= org.apache.commons.lang3               | 3.5.0      | 3.5.0 
+ org.apache.commons.lang3.builder       | 3.3.0      | 3.5.0
+ org.apache.commons.lang3.concurrent    | 3.1.0      | 3.5.0
+ org.apache.commons.lang3.event         | 3.1.0      | 3.5.0
+ org.apache.commons.lang3.exception     | 3.2.0      | 3.5.0
+ org.apache.commons.lang3.math          | 3.2.0      | 3.5.0
+ org.apache.commons.lang3.mutable       | 3.2.0      | 3.5.0 
+ org.apache.commons.lang3.reflect       | 3.4.0      | 3.5.0
+ org.apache.commons.lang3.text          | 3.3.0      | 3.5.0
+ org.apache.commons.lang3.text.translate| 3.2.0      | 3.5.0
* org.apache.commons.lang3.time          | 5.0.0      | 3.5.0
+ org.apache.commons.lang3.tuple         | 3.1.0      | 3.5.0

[ 在我为 commons-compress 打开一个关于 OSGI 版本问题的问题之后,我正在与一些 COMMONS 项目人员讨论包版本。对于这个项目,每个包的每个版本都与发布号相同(扩展到三位数字),并且都在[1,2].

范围内

folks commons 超级项目因 packageinfo 文件位于源目录中而挂起;可能是因为我从 src 树中添加了 packageinfo 文件的手动副本,这显然不再需要了。他们还希望自动生成包版本。

我还没有正确解释为什么 maven-bundle-plugin 默认为每个包使用发布版本是危险的,并且更改包版本应该由更改源的人以更改的方式完成版本(以避免意外的破坏性更改),基线验证作为一种单元测试。

具有讽刺意味的是,我提交了这些更改,作为准备合并一些对压缩的实质性贡献的一部分,这些贡献是为了帮助存储来自 Maven Central 的每个声明的包,以便分析包版本号的可靠性,并查看在使用数据库支持的存储库时可以做多少工作来自动修复它们(并查看捆绑包系列中是否有任何可预测可靠性的功能)。 ]