【问题标题】:How to hide embedded dependencies when using an OSGI bundle with maven?使用带有 maven 的 OSGI 包时如何隐藏嵌入式依赖项?
【发布时间】:2019-09-24 21:56:30
【问题描述】:

有没有办法将 OSGI 包用作 maven 依赖项,而无需将其中的所有包都放入它甚至不导出的类路径中?

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

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

【问题讨论】:

  • 解决冲突的一种方法是在项目 pom 中的 dependencyManagement 下包含所需版本的冲突依赖项。
  • @awd 谢谢,但这不起作用:依赖项不包括从 sling.xss 传递,而是直接嵌入到 sling.xss jar 中。这不是 maven 控制的东西。
  • 这是人们所做的非常糟糕的事情之一,只是将其他包着色/导入到自己的包中,这会阻止其他人将它们排除在外......
  • 我认为主要问题是没有 API jar。由于 sling 是一个非常开放的社区,我可以想象我们可以改变它。
  • @khmarbaise 是的。不幸的是,如果您不希望/不能将依赖项部署为 OSGI 包,有时似乎甚至需要 OSGI。 :-( 但正如 ChristianSchneider 所说,这里真正的问题似乎是没有 API jar。

标签: java maven osgi osgi-bundle sling


【解决方案1】:

您可以在构建系统中包含一个执行 OSGi 解析的步骤,例如使用 bnd-export-maven-plugin

如果您编写的代码依赖于另一个捆绑包的非导出包,那么构建作为一个整体将会失败。这是因为 bnd 会自动为您在 bundle 中使用的包添加一个Import-Package,但解析步骤将无法在另一个 bundle 中找到对应的Export-Package

当然这并不理想。您仍然可以在 IDE 中编写代码并使用 maven-compiler-plugin 进行编译。但您至少在运行运行时之前就发现了问题。

【讨论】:

  • 谢谢,但我不明白这如何适用于该问题。我的问题是 sling.xss 包含许多类,例如commons.beanutils 覆盖了我在类路径中的 common.beanutils 版本,因为真正的 common.beanutils 稍后出现。这甚至产生了编译时错误。我可以通过将 commons.beanutils 放在 pom.xml 中的 sling.xss 之前来解决该编译时错误,但这是一个非常肮脏的解决方案。
  • @Hans-PeterStörr 你说得对,对不起。我没有仔细阅读你的问题。常见的问题是“我在编译时使用了一个在运行时不可见的包,我怎样才能使它成为编译时错误?”,我根据您的第一句话得出了结论。
【解决方案2】:

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

推荐的方法是将包拆分成一个 API 包,它只定义 API,一个实现包,导入 API 并导入或嵌入所有实现依赖项。

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

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

【讨论】:

    猜你喜欢
    • 2018-10-05
    • 2021-07-05
    • 2018-09-20
    • 2020-02-03
    • 2014-11-20
    • 2020-03-02
    • 2019-11-03
    • 2014-03-12
    • 2018-10-24
    相关资源
    最近更新 更多