我有一个奇怪的问题。我有一个以前部署在tomcat中的Java应用程序,并且很高兴地使用logback classic作为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();
拥有他的类是弹簧注入而且失败 - 因此无法部署整个应用程序。有人有解决方案吗?提前致谢
在查看此站点和其他论坛后,我意识到Jboss 7捆绑了它自己的slf4j实现,并实现LogbackContext在logback中执行的相同ILoggerFactory接口。我们的应用程序尝试获取相同的实例,但应用服务器强加了它自己的slf4j实现。
我尝试修改jboss \ modules \ org \ slf4j \ impl \ main中的module.xml,并将其指向logback jar。
<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专家都可以提供帮助吗? 提前致谢
答案 0 :(得分:58)
您需要从部署中排除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>
答案 1 :(得分:7)
如果您在应用中使用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" />
答案 2 :(得分:3)
还有另一种方法:
完全禁用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>
部署应用程序后,bootstrap日志记录(boot.log)也会继续工作,server.log将显示部署日志记录。但是你的所有应用程序都是通过你的战争中的(在这个例子中)slf4j + logback记录的。
请注意,您不需要使用-Dorg.jboss.logging.provider=slf4j
运行JBoss,如果您指定了它,则需要提供JBoss模块(通常为slf4j-api,logback-classic和logback-core),但它不是值得努力,因为JBoss日志记录现在仅用于bootstrap(boot.log)和部署信息(server.log)。
参考文献:
http://tinyapps.blogspot.com/2013/01/getting-logback-and-slf4j-to-work-in.html
https://stackoverflow.com/a/19695680/2587343