捆绑异常:无法解析模块,因为它导出包'org.slf4j.spi'并且还从 com.springsource.slf4j.api 向它公开



在什么情况下,可能会发生以下错误?当启动具有多个捆绑包的应用程序时,这种情况偶尔会发生。这个错误的修复方法是什么?

Caused by: org.osgi.framework.BundleException: Unable to resolve module com.springsource.slf4j.api [135.0] because it exports package 'org.slf4j.spi' and is also exposed to it from com.springsource.slf4j.api [135.0] via the following dependency chain:
  com.springsource.slf4j.api [135.0]
    import: (&(package=org.slf4j.impl)(version>=1.6.1)(!(version>=2.0.0)))
     |
    export: package=org.slf4j.impl; uses:=org.slf4j
  com.springsource.slf4j.api [135.0]
    import: (&(package=org.slf4j)(version>=1.6.1)(version<=1.6.1))
     |
    export: package=org.slf4j; uses:=org.slf4j.spi
  com.springsource.slf4j.api [135.0]
    import: (&(package=org.slf4j.spi)(version>=1.6.1)(version<=1.6.1))
     |
    export: package=org.slf4j.spi
  com.springsource.slf4j.api [135.0]
    at org.apache.felix.framework.Felix.resolveBundle(Felix.java:3574)
    at org.apache.felix.framework.Felix.loadBundleClass(Felix.java:1619)

SLF4J对OSGi友好,因此不需要使用基于springsource的jar-s。

使用您想要使用的实现安装最新的slf4j-api jar!

工作原理:

slf4j-api使用的类不在jar中,也不导入。slf4j-xxximpl(类似于slf4j-simple)是片段捆绑包,其中主机是slf4j-api,因此它们将有一个通用的类加载器。

这意味着您必须同时安装一个slf4j-api和slf4j-xxx(如果您在运行时安装它,则在必要时在容器上调用刷新以获得良好的连接)。这也意味着slf4j不能与更多的实现一起工作,并且在同一个容器中拥有多个版本的slf4j-api也不是一个好主意。

解决方案:删除基于springsource的jar,并将最新的slf4j-api和impl-jar安装到容器中,然后在必要时调用刷新。

最新更新