在包版本明显不匹配的情况下,SLF4J OSGi 如何工作?

How does SLF4J OSGi work given apparent mismatch in package versions?

在 1.6.0 之后我看过的所有 SLF4J 版本中,slf4j-api MANIFEST.MF 看起来像(这是在 1.7.21 中):

Import-Package: org.slf4j.impl;version=1.6.0

但是后端(例如 slf4j-log4j12)说:

Export-Package: org.slf4j.impl;version=1.7.21

这不适合在一起,导致未解决的封装布线。

我知道很多人在 OSGi 中使用 SLF4J。哎呀, 使用它,它有效,但 pax-logging 可能掩盖了这个问题。我错过了什么吗?

Import-Package: org.slf4j.impl;version=1.6.0

在 Import-Package 指定确切的版本意味着版本 1.6.0 或更高版本。因此这一行不会导致未解析的包。

但是,所有 SLF4J 实现包也需要 API。通过这条规则,我们得到了循环依赖。 SLF4J 人员通过将每个实现包作为 API.

的片段包解决了这个问题

在每个实施包中,您可以看到这些:

Fragment-Host: slf4j.api

Import-Package: org.slf4j;version=1.7.21,...

基于 MANIFEST headers:实施包的版本必须至少为 1.6.0,API 包的版本必须至少与实施包的版本一样大。