1

我正在尝试将 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 Connection(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 是硬编码的。

其次,我添加<packagingExcludes>WEB-INF/lib/infinispan-embedded-9.1.0.Final.jar!/org/slf4j/impl/StaticLoggerBinder.class</packagingExcludes>到 maven-war-plugin 中(可能带有“!”符号我们无法访问嵌套 jar,但我没有找到其他变体)。尝试失败。

那么,我该如何解决这个异常呢?也许可以使用 maven-shade-plugin?但这对我的项目来说似乎是不可接受的。

4

2 回答 2

0

我有一些问题。我用一个技巧解决它。我从依赖项中排除 logback。我使用 infinispan-embedded 作为记录器。但我认为这不是解决问题的正确方法。我认为“ http://infinispan.org/ ”开发人员需要将有关 logger 的代码导出为另一个 jar。然后我们可以在maven中排除。实际上,由于另一项任务,依赖 logger jar 并不是正确的方法。

我写信给 infinispan 团队,他们很快就回复了。正如他们所说,infinispan-embedded 是“uber-jar”,意思是“所有依赖项合二为一”。您可以使用 infinispan 的每个依赖项来代替它。infinispan-core 和您要使用的。

您可以通过单击 jboss 网站上的此链接https://developer.jboss.org/message/975209?et=watches.email.thread#975209查看已打开问题的详细信息。

于 2017-08-14T21:12:08.037 回答
0

我有一些问题。我用一个技巧解决它。我从依赖项中排除 logback。我使用 infinispan-embedded 作为记录器。但我认为这不是解决问题的正确方法。我认为“ http://infinispan.org/ ”开发人员需要将有关 logger 的代码导出为另一个 jar。然后我们可以在maven中排除。实际上,由于另一项任务,依赖 logger jar 并不是正确的方法。

于 2017-08-14T15:00:03.670 回答