首页 > 解决方案 > 使用带有 maven 的 OSGI 包时如何隐藏嵌入式依赖项?

问题描述

有没有一种方法可以将 OSGI 包用作 maven 依赖项,而无需将所有包从它获取到它甚至不导出的类路径中?

问题的背景:我们刚刚将org.apache.sling.xss包作为 maven 依赖项添加到我们的项目中。正如您在 pom.xml中看到的那样,它只是导出包 org.apache.sling.xss 但将各种依赖项直接嵌入到它的jar中作为Private-Package。虽然 OSGI 对其他包隐藏了这些东西,但 maven 没有。所以我们会遇到冲突:org.apache.sling.xss 嵌入了例如版本 1.7.0 的 commons-beanutils,它与我们一直在使用的新版本的 commons-beanutils 不兼容,因此我们现在会遇到编译错误。

有没有什么好的解决方案——无论是从我们的角度还是从 org.apache.sling.xss 包的维护者的角度来看?理想情况下,如果您使用该捆绑包,您只会将导出的 org.apache.sling.xss 包放入类路径。因此,如果 org.apache.sling.xss 提供了一个单独的 API jar,只包含该类,那么也许一个好的解决方案是?有没有标准的方法来做到这一点,或者其他解决方案?我们能以某种方式告诉 maven 只将那个包包含到类路径中吗?(我知道 maven 有依赖排除,但这在这里没有帮助,因为有问题的东西不是 sling.xss 的传递依赖,而是实际上包含在 org.apache.sling.xss jar 中。)

标签: javamavenosgiosgi-bundlesling

解决方案


不幸的是,没有用 maven 处理此类捆绑包的好方法。

推荐的方法是将捆绑包拆分为一个仅定义 API 的 API 捆绑包和一个导入 API 并导入或嵌入所有实现依赖项的实现捆绑包。

这样,消费者将只对 API 有 maven 依赖,并且根本不会出现问题。

您可以为 sling xss 打开一个 jira 问题以提供 API 包吗?


推荐阅读