Logback и Jboss 7 - не работают вместе?
У меня возникла любопытная проблема. У меня было это приложение Java, которое ранее было развернуто в tomcat и с радостью использовало классический журнал в качестве реализации slf4j. Теперь, когда мы попытались развернуть одно и то же приложение на сервере jboss 7.1.final, он даже не развертывает приложение maoning
java.lang.ClassCastException: org.slf4j.impl.Slf4jLoggerFactory cannot be cast to ch.qos.logback.classic.LoggerContext
Это оскорбительная строка кода
final LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
Класс, который имеет его spring, вводится, и это не работает - следовательно, все приложение не может быть развернуто. Кто-нибудь получил решение? Спасибо заранее
Посмотрев на этом сайте плюс другие форумы, я понял, что Jboss 7 поставляется с его собственной реализацией slf4j и реализует тот же интерфейс ILoggerFactory, что и LoggerContext в logback. Наше приложение попыталось получить экземпляр того же самого, но сервер приложений навязывает ему собственную реализацию slf4j.
Я попытался изменить module.xml в jboss\modules\org\slf4j\impl\main и указал его на баннеры журнала.
<resources>
<resource-root path="logback-classic-0.9.28.jar"/>
<resource-root path="logback-core-0.9.28.jar"/>
</resources>
Теперь, когда я запускаю приложение, я получаю серьезную ошибку
Exception starting filter WicketFilter: java.lang.ClassCastException: ch.qos.logback.classic.LoggerContext cannot be cast to ch.qos.logback.classic.LoggerContext
Я нахожусь на своем пути. Любые эксперты jboss и logback могут помочь?
Спасибо заранее
Ответы
Ответ 1
Вам нужно исключить версию slf4j сервера из вашего развертывания. Создайте файл jboss-deployment-structure.xml
и поместите его в каталог WARS META-INF
или WEB-INF
.
Содержимое файла должно выглядеть следующим образом:
<jboss-deployment-structure>
<deployment>
<!-- Exclusions allow you to prevent the server from automatically adding some dependencies -->
<exclusions>
<module name="org.slf4j" />
<module name="org.slf4j.impl" />
</exclusions>
</deployment>
</jboss-deployment-structure>
Ответ 2
Если вы используете мосты для jul или jcl в своем приложении, вы также должны их исключить:
<module name="org.slf4j" />
<module name="org.slf4j.jcl-over-slf4j" />
<module name="org.slf4j.impl" />
<module name="org.jboss.logging.jul-to-slf4j-stub" />
Ответ 3
Существует альтернативный подход:
- У вас есть регистрация, настроенная в вашей войне.
- у вас есть все зависимости в вашей войне.
- вы ничего не настраиваете в каталоге сервера JBoss, даже дополнительные модули JBoss
Просто отключите ведение журнала JBoss полностью и полагайтесь на зависимости в вашей войне. Измените jboss-deployment-structure.xml
следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
<deployment>
<exclusions>
<module name="org.apache.commons.logging" />
<module name="org.apache.log4j" />
<module name="org.jboss.logging" />
<module name="org.jboss.logging.jul-to-slf4j-stub" />
<module name="org.jboss.logmanager" />
<module name="org.jboss.logmanager.log4j" />
<module name="org.slf4j" />
<module name="org.slf4j.impl" />
<module name="org.slf4j.jcl-over-slf4j" />
</exclusions>
</deployment>
</jboss-deployment-structure>
После развертывания вашего приложения журнал загрузки (boot.log) продолжает работать, также server.log будет показывать журнал развертывания. Но все ваше приложение регистрируется через ваш (в этом примере) slf4j + logback в вашей войне.
Обратите внимание, что вам не нужно запускать JBoss с помощью -Dorg.jboss.logging.provider=slf4j
, если вы укажете это, вам нужно будет предоставить модули JBoss (обычно slf4j-api, logback-classic и logback-core), но это не стоит поскольку журнал JBoss теперь используется только для загрузки (boot.log) и для информации о развертывании (server.log).
Литература:
http://tinyapps.blogspot.com/2013/01/getting-logback-and-slf4j-to-work-in.html
fooobar.com/info/150867/...