【发布时间】:2017-12-29 05:09:40
【问题描述】:
我正在尝试将 infinispan 从 8.2.4.Final 升级到 9.1.0.Final,但是在构建 tomcat 战争文件时从嵌入式 slf4j 中得到一些错误。
日志:
SLF4J:类路径包含多个 SLF4J 绑定。
SLF4J:发现绑定在 [jar:file:/C:/tomcat/webapps/ROOT/WEB-INF/lib/infinispan-embedded-9.1.0.Final.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J:发现绑定在 [jar:file:/C:/tomcat/webapps/ROOT/WEB-INF/lib/logback-classic-1.1.6.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J:请参阅http://www.slf4j.org/codes.html#multiple_bindings 解释。
SLF4J:实际绑定是类型 [org.jboss.slf4j.JBossLoggerFactory] 20-Jul-2017 16:07:34.170
错误 [RMI TCP 连接(5)-127.0.0.1] com.myapp.context.LogbackLoggingConfigurator.configureLoggingExternal 从 C:\my-files\conf\logback.xml 加载记录器配置
java.lang.ClassCastException:org.jboss.slf4j.JBossLoggerFactory 不能转换为 ch.qos.logback.classic.LoggerContext
日志中提到的代码:
public void configureLogging(final URL config) {
final LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
try {
lc.reset();
final JoranConfigurator configurator = new JoranConfigurator();
configurator.setContext(lc);
configurator.doConfigure(config);
} catch (final JoranException je) {
logger.error("Unable to configure logback", je);
}
StatusPrinter.printInCaseOfErrorsOrWarnings(lc);
}
这里是错误的行:final LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
首先,我从“infinispan-embedded”依赖项中排除了 slf4j-api,但没有成功,因为 slf4j 是硬编码的。
其次,我在 maven-war-plugin 中添加了 <packagingExcludes>WEB-INF/lib/infinispan-embedded-9.1.0.Final.jar!/org/slf4j/impl/StaticLoggerBinder.class</packagingExcludes>(可能带有 '!' 符号我们无法访问嵌套 jar,但我没有找到其他变体)。尝试失败。
那么,我该如何解决这个异常呢?也许可以使用 maven-shade-plugin?但这对我的项目来说似乎是不可接受的。
【问题讨论】:
-
我相信排除类在这里不起作用。 Infinispan Embedded,我们称之为 uber jar,在存档中包含一些日志记录类。处理它的正确方法是使用所谓的小罐子。尝试将 Infinispan Core 添加到您的部署(可能还有其他集成位)而不是 Infinispan Embedded。
-
确实,避免使用 uber jar,它们不是为 Maven/Gradle 之类的环境设计的。
标签: java tomcat logback infinispan infinispan-9