java.lang.NoSuchMethodError:org.jboss.logging.Logger.getMessageLogger(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Object-Tomcat 8

java.lang.NoSuchMethodError:org.jboss.logging.Logger.getMessageLogger(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Object-Tomcat 8,java,maven,tomcat,classloader,Java,Maven,Tomcat,Classloader,我得到一个例外: 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.hi

我得到一个例外:

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)
java.lang.NoSuchMethodError:org.jboss.logging.Logger.getMessageLogger(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Object;
位于org.hibernate.ejb.Ejb3Configuration(Ejb3Configuration.java:142)
位于org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:55)
位于javax.persistence.persistence.createEntityManagerFactory(persistence.java:63)
为什么??有两个jar包含类记录器。这些罐子是:

-jboss日志spi和jboss日志

Jboss-logging-spi.jar是jbosscache-core.jar的一个可传递依赖项,不幸的是,它首先被Tomcat8加载

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

其他信息:

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

解决这个问题的最佳方法是什么

消除重复类。时期没有其他建议。通过类加载顺序掩盖问题将在稍后弹出类似的问题,这使得下次维护更加困难


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

通过滥用Tomcat中的
资源
功能,可以在Tomcat中完成显式JAR排序。我不打算在这里给出一个完整的答案,因为(a)这是非常不推荐的,(b)你最好真的知道你在做什么才能做到

因此,简单地说:

  • 通读
  • 使用
    将一个或多个库强制到行的前面
  • 重新考虑你是真的想这样做,还是仅仅解决最初的问题

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