Hibernate 5 java.lang.NoSuchMethodError org.jboss.logging.Logger.debugf Hibernate 5出现java.lang.NoSuchMethodError org.jboss.logging.Logger.debugf错误。

42

当我使用 Hibernate 5 部署 Web 应用程序时,我遇到了问题。

Caused by: java.lang.NoSuchMethodError: org.jboss.logging.Logger.debugf(Ljava/lang/String;I)V
at org.hibernate.internal.NamedQueryRepository.checkNamedQueries(NamedQueryRepository.java:149) [hibernate-core-5.0.0.CR2.jar:5.0.0.CR2]
at org.hibernate.internal.SessionFactoryImpl.checkNamedQueries(SessionFactoryImpl.java:759) [hibernate-core-5.0.0.CR2.jar:5.0.0.CR2]
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:490) [hibernate-core-5.0.0.CR2.jar:5.0.0.CR2]
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:444) [hibernate-core-5.0.0.CR2.jar:5.0.0.CR2]
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:708) [hibernate-core-5.0.0.CR2.jar:5.0.0.CR2]
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:724) [hibernate-core-5.0.0.CR2.jar:5.0.0.CR2]
at org.springframework.orm.hibernate4.LocalSessionFactoryBuilder.buildSessionFactory(LocalSessionFactoryBuilder.java:372) [spring-orm-4.1.7.RELEASE.jar:4.1.7.RELEASE]
at org.springframework.orm.hibernate4.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:454) [spring-orm-4.1.7.RELEASE.jar:4.1.7.RELEASE]
at org.springframework.orm.hibernate4.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:439) [spring-orm-4.1.7.RELEASE.jar:4.1.7.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1633) [spring-beans-4.1.7.RELEASE.jar:4.1.7.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1570) [spring-beans-4.1.7.RELEASE.jar:4.1.7.RELEASE]
... 23 more

使用Hibernate 4一切正常。

我查看了位于第149行的NamedQueryRepository类。该类以这种方式调用debugf方法:

        log.debugf( "Checking %s named HQL queries", namedQueryDefinitionMap.size() );

我看不到问题

这是我的依赖树

[INFO] ------------------------------------------------------------------------
[INFO] Building app Maven Webapp 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ app---
[INFO] +- org.springframework:spring-aspects:jar:4.1.7.RELEASE:compile
[INFO] |  \- org.aspectj:aspectjweaver:jar:1.8.6:compile
[INFO] +- org.springframework:spring-tx:jar:4.1.7.RELEASE:compile
[INFO] +- org.springframework:spring-beans:jar:4.1.7.RELEASE:compile
[INFO] +- org.springframework:spring-context-support:jar:4.1.7.RELEASE:compile
[INFO] +- org.springframework:spring-context:jar:4.1.7.RELEASE:compile
[INFO] |  \- org.springframework:spring-expression:jar:4.1.7.RELEASE:compile
[INFO] +- org.springframework:spring-core:jar:4.1.7.RELEASE:compile
[INFO] |  \- commons-logging:commons-logging:jar:1.2:compile
[INFO] +- org.springframework:spring-orm:jar:4.1.7.RELEASE:compile
[INFO] +- org.springframework:spring-web:jar:4.1.7.RELEASE:compile
[INFO] +- org.springframework:spring-aop:jar:4.1.7.RELEASE:compile
[INFO] |  \- aopalliance:aopalliance:jar:1.0:compile
[INFO] +- org.springframework:spring-jdbc:jar:4.1.7.RELEASE:compile
[INFO] +- org.springframework:spring-test:jar:4.1.7.RELEASE:test
[INFO] +- junit:junit:jar:4.12:test
[INFO] |  \- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] +- org.hibernate:hibernate-entitymanager:jar:5.0.0.CR2:compile
[INFO] |  +- org.jboss.logging:jboss-logging:jar:3.3.0.Final:compile
[INFO] |  +- org.hibernate:hibernate-core:jar:5.0.0.CR2:compile
[INFO] |  |  +- antlr:antlr:jar:2.7.7:compile
[INFO] |  |  \- org.jboss:jandex:jar:1.2.2.Final:compile
[INFO] |  +- dom4j:dom4j:jar:1.6.1:compile
[INFO] |  |  \- xml-apis:xml-apis:jar:1.0.b2:compile
[INFO] |  +- org.hibernate.common:hibernate-commons-annotations:jar:5.0.0.Final:compile
[INFO] |  +- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:jar:1.0.0.Final:compile
[INFO] |  +- org.apache.geronimo.specs:geronimo-jta_1.1_spec:jar:1.1.1:compile
[INFO] |  \- org.javassist:javassist:jar:3.18.1-GA:compile
[INFO] +- org.hibernate:hibernate-c3p0:jar:5.0.0.CR2:compile
[INFO] |  \- com.mchange:c3p0:jar:0.9.2.1:compile
[INFO] |     \- com.mchange:mchange-commons-java:jar:0.2.3.4:compile
[INFO] +- org.primefaces:primefaces:jar:5.2.RC3:compile
[INFO] +- org.apache.logging.log4j:log4j-api:jar:2.2:compile
[INFO] +- org.apache.logging.log4j:log4j-core:jar:2.2:compile
[INFO] \- net.sourceforge.jtds:jtds:jar:1.2.8:compile
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
16个回答

32
在GlassFish中,这个问题是由与GlassFish模块的依赖项冲突引起的。如果您检查GlassFish目录下modules的lib列表,您会看到boss-logging.jar。您可以删除它并替换为最新的版本,例如org.jboss.logging:jboss-logging:jar:3.3.0.Final。这对我很有效。

我不得不在Payara Server中这样做并重新启动域,一切都正常工作。 - Moreno

17

在我的情况下,罪魁祸首是Jersey bean验证器工件。它的一个依赖项bean-validation-2.4.0-b06.jar包含Jboss日志记录类,由于某种原因。我不得不从spring-boot-starter-jersey依赖项中排除jersey-bean-validation和bean-validator工件:

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jersey</artifactId>
        <exclusions>
            <exclusion>
                <artifactId>jersey-bean-validation</artifactId>
                <groupId>org.glassfish.jersey.ext</groupId>
            </exclusion>
            <exclusion>
                <artifactId>bean-validator</artifactId>
                <groupId>org.glassfish.hk2.external</groupId>
            </exclusion>
        </exclusions>
    </dependency>

编辑:从spring-boot 1.3.0开始,这个问题已经被解决了,上述排除不再必要。


1
这对我非常有效,我需要将其添加到org.glassfish.ext -> jersey-spring3依赖项中。 - Chris Hinshaw
@danieln 我想知道你是如何知道有问题的jar文件的。mvn依赖插件只显示1层深度,而jboss类是2层深度。 - Francis Zabala
2
@FrancisZabala 你可以使用你的IDE来解决这个问题和类似的问题。我正在使用Eclipse,并使用打开类型对话框(ctrl-shift-T)并将org.jboss.logging.Logger(异常中的类)粘贴到搜索字段中,在结果中显示了有问题的bean-validator-2.4.0-b31.jar,它在.m2\repository\org\glassfish\hk2\external\bean-validator\2.4.0-b31下,还有其他结果,这些是原始的jboss-logging jar。 - Daniel Nitzan
然后我在Eclipse中使用POM依赖层次结构选项卡搜索该构件,它确实会显示jersey-spring3下面有它。 - Daniel Nitzan
3
我没有使用spring-boot,而是使用了spring-core 4.2.4、hibernate 5.0.7和jersey-spring3 2.22.1。但仍然遇到了这个错误。通过从org.glassfish.jersey.ext:jersey-spring3:2.22.1中排除org.glassfish.hk2.external:bean-validator,然后将org.glassfish.jersey.ext:jersey-bean-validation:2.22.1添加为直接依赖项来解决它。 - Sathish
显示剩余3条评论

15

尝试升级jboss-logging.jar到更高的版本。您正在使用的版本似乎与Hibernate 5不兼容。


4
这是一个更好的解决方案。我将 jboss-logging.jar 升级到了 3.3.0 版本(在 widlfly 安装文件夹中搜索),并在 module.xml 文件中更改了文件名,现在一切都正常了。我正在使用带有 hibernate 5 的 Wildfly 8。 - tggm
3
3.3.0.Final已经在使用中,这是截至今天(一年后)最新的版本,因此无需升级。 - Kalle Richter
mvn-tree 上面显示 OP 已经在使用 org.jboss.logging:jboss-logging:jar:3.3.0.Final。问题在于另一个构件带来了相同的类,并且在类路径中被先发现。 - Michael Piefel

4

当我在Weblogic服务器上部署EAR时,也遇到了这种问题。显然,Weblogic也使用JBoss日志系统,并且使用旧版本的它。
我的解决方法:
在META-INF文件夹中添加“weblogic-application.xml”文件,并使用以下内容:

    <?xml version="1.0" encoding="UTF-8"?>
    <weblogic-application>
        <prefer-application-packages>
            <package-name>org.jboss.logging.*</package-name>
        </prefer-application-packages>

        <prefer-application-resources>
            <resource-name>org/jboss/logging/Logger.class</resource-name>
        </prefer-application-resources>
    </weblogic-application>

3

我在使用jersey-spring-3和hibernate 5.0.1.Final时也遇到了同样的错误。通过从jersy-spring-3中排除org.glassfish.hk2.external:bean-validator并添加org.glassfish.jersey.ext:jersey-bean-validation,问题得以解决。以下是我的最终依赖项。

<dependency>
    <groupId>org.glassfish.jersey.ext</groupId>
    <artifactId>jersey-spring3</artifactId>
    <version>2.22.2</version>
    <exclusions>
        <exclusion>
            <groupId>org.glassfish.hk2.external</groupId>
            <artifactId>bean-validator</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.ext</groupId>
    <artifactId>jersey-bean-validation</artifactId>
    <version>2.22.2</version>
</dependency>

来自:

<dependency>
    <groupId>org.glassfish.jersey.ext</groupId>
    <artifactId>jersey-spring3</artifactId>
    <version>2.22.2</version>
</dependency>

2
很有可能您的应用程序类路径上存在过时的JBoss Logging JAR。Logger API中的...f方法是相对较新的添加内容。Hibernate 5直接依赖于Logging版本3.3.0,但是在您的pom.xml中可能存在覆盖较早版本的依赖项。另一个可能性是您正在部署到一个由JBoss容器提供日志API的容器中。那么您可能需要升级JBoss服务器,或者引入一种解决方案来优先使用应用程序提供的类。

事实上,我正在使用Maven,而jboss-logging是Hibernate 5的直接依赖项。 - Jago Satori
没错。我的回答解释了即使有错误的JAR包也可能会涉及其中。由于您的依赖树显示了正确版本的JBoss日志记录,另一个选项是从容器继承的类覆盖了您的应用程序类。顺便说一下,这对于日志记录类来说是非常常见的问题。 - Marko Topolnik

2
请查看我的答案,网址为:NoSuchMethodError: org.jboss.logging.Logger.debugf 在升级到Hibernate 5.2后,我也遇到了问题,罪魁祸首是“jboss-logging 3.3.0.Final”,我发现你的依赖中也存在这个问题。按照答案中分享的步骤,你可以将依赖项 jboss-logging 降级到 3.2 版本,该版本具有所需功能。

1
我也遇到了这个问题。以下是解决方法:
       <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.2.1.RELEASE</version>
            <exclusions>
                <exclusion>
                    <groupId>commons-logging</groupId>
                    <artifactId>commons-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

1

在我的情况下,问题是由于hibernate-ehcache中作为传递依赖项而来的较旧版本的jboss-logging引起的,我通过查看maven依赖树找到了它。我通过添加排除来解决了这个问题:

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-ehcache</artifactId>
        <version>${hibernate.version}</version>
        <exclusions>
            <exclusion>
                <groupId>org.jboss.logging</groupId>
                <artifactId>jboss-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

1
我收到的错误信息是"

"。
Application run failed: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.jboss.logging.Logger.debugf(Ljava/lang/String;I)V

:::
:::
Caused by: java.lang.NoSuchMethodError: org.jboss.logging.Logger.debugf(Ljava/lang/String;I)V"

我删除了jboss-logging文件夹 <.m2\repository\org\jboss\logging\jboss-logging> 并重新启动了jboss服务器。

这些jar被重新添加,错误已经消失。(之后我遇到了其他错误,但至少这个错误已经解决了)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接