【问题标题】:java.lang.NoSuchMethodError: org.jboss.logging.Logger.getMessageLogger(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Object - Tomcat 8java.lang.NoSuchMethodError: org.jboss.logging.Logger.getMessageLogger(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Object - Tomcat 8
【发布时间】:2018-04-13 16:20:30
【问题描述】:

我遇到了这个异常:

java.lang.NoSuchMethodError: org.jboss.logging.Logger.getMessageLogger(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Object;
            at org.hibernate.ejb.Ejb3Configuration.<clinit>(Ejb3Configuration.java:142)
            at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:55)
            at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:63)

为什么?有两个 jar 包含类 Logger。罐子是:

-jboss-logging-spi 和 jboss-logging

Jboss-logging-spi.jar 是 jbosscache-core.jar 的传递依赖,不幸的是它首先被 Tomcat 8 加载。

解决此问题的最佳方法是什么?是否可以控制Tomcat加载.jar的顺序?

附加信息:

-我无法让它在新服务器(Ubuntu)上运行的当前 .war 文件在旧服务器(OpenSuse)上运行。

【问题讨论】:

  • 虽然不建议尝试订购 JAR 文件加载,但这是可能的。你为什么使用两个不兼容的 .class 定义?看来您需要让所有库都同意正在使用的版本。
  • 这是一个遗留系统。我无法控制它。 .war 在旧服务器上运行,但我无法让它在我正在安装的新服务器上运行。你知道为什么吗?因为 jar 已在 Tomcat 中以不同的顺序加载。这样我想优先考虑某个罐子。你能告诉我怎么做吗?

标签: java maven tomcat classloader


【解决方案1】:

解决此问题的最佳方法是什么?

消除重复的类。 期间。没有其他建议。通过类加载顺序来掩盖问题,后面会弹出类似的问题,让下次维护更加困难。

一个应用程序应该从不包含同一个类的两个冲突的实现(甚至两个相同的实现)。如果其中一个类在 (appserver-) 全局类路径上:从那里删除它。

【讨论】:

    【解决方案2】:

    通过滥用 Tomcat 中的resources 工具,可以在 Tomcat 中实现显式 JAR 排序。我不会在这里给出完整的答案,因为 (a) 非常不推荐这样做,并且 (b) 你最好真正知道自己在做什么才能做到这一点。

    所以,简单地说:

    1. 阅读所有关于resources
    2. 使用&lt;PreResources&gt; 将一个或多个库强制放在行首
    3. 重新考虑您是否真的要这样做,或者只是解决最初的问题

    【讨论】:

      相关资源