slf4j 日志

By | 2025年5月7日

OSGI bundle 中使用

升级到JDK21、Spring6后,打包遇到 maven-bundle-plugin 插件会将 org.slf4j.impl 这个包的声明放到 jar 包的 classes\META-INF\MANIFEST.MF 文件的 Import-Package 里。这导致其他项目引入这个 OSGI bundle时必须导入这个 org.slf4j.impl,这其实是有问题的,之前都不需要导入。

org.slf4j.impl 是 SLF4J 的“实现包”,比如 slf4j-log4j12.jar、slf4j-simple.jar 等才会包含它;
正确的 SLF4J 用法应只依赖接口包(org.slf4j.*),不应直接引用 impl 包;
但在某些情况下(如下)构建工具会错误地加入 org.slf4j.impl 到 Import-Package 中。正确做法是排除 org.slf4j.impl 包(推荐)。只需在 maven-bundle-plugin 插件里排除掉:Import-Package: !org.slf4j.impl, * 的作用是:告诉 OSGi 不要在 MANIFEST.MF 中声明 org.slf4j.impl 的导入要求。

最终解决办法:

maven-bundle-plugin 生成的 MANIFEST.MF:

可以看到 Import-Package里已经没有 org.slf4j.impl 了。SpringBoot主程序安装此bundle,也可以打印bundle里的日志了。

提示:升级后导致 Import-Package 里多出很多包,可能是依赖包的作用域发生了变化,比如从 compile 变成了 provided。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注