BundleException: невозможно разрешить модуль, поскольку он экспортирует пакет '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)
1 ответ
С тех пор SLF4J дружественен к OSGi, поэтому нет необходимости использовать jars-s на основе springsource.
Установите новейший jar slf4j-api с реализацией, которую вы хотели бы использовать!
Как это устроено:
slf4j-api использует классы, которых нет в jar, и они не импортируются. slf4j-xxximpl (как и slf4j-simple) - это наборы фрагментов, где хостом является slf4j-api, поэтому у них будет общий загрузчик классов.
Это означает, что вы должны установить slf4j-api и slf4j-xxx вместе (если вы устанавливаете его во время выполнения, при необходимости обновите контейнер, чтобы иметь хорошее соединение). Это также означает, что slf4j не может работать с большим количеством реализаций, и также не очень хорошая идея иметь несколько версий slf4j-api в одном контейнере.
Решение. Удалите jar-файл на основе springsource и установите в контейнер новейшие jar-файлы slf4j-api и impl, а после этого вызовите обновление при необходимости.