在什么情况下,可能会发生以下错误?当启动具有多个包的应用程序时,偶尔会发生这种情况。这个错误的修复方法是什么?
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)
答案 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安装到容器中,然后在必要时调用刷新。