BundleException:无法解析模块,因为它导出包'org.slf4j.spi'并且也从com.springsource.slf4j.api公开它

时间:2013-08-27 09:43:44

标签: spring osgi apache-felix

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

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)

1 个答案:

答案 0 :(得分:1)

SLF4J对OSGi很友好,因此不需要使用基于springource的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安装到容器中,然后在必要时调用刷新。