【问题标题】:Can not upgrade infinispan to 9.1.0.Final: ClassCastException无法将 infinispan 升级到 9.1.0.Final:ClassCastException
【发布时间】: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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-07-01
      • 2019-02-26
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 2017-10-18
      • 2016-03-11
      • 2020-05-07
      • 2012-09-04
      相关资源
      最近更新 更多