hibernate-entitymanager NoSuchMethodError:org.jboss.logging.Logger.debugf(Ljava / lang / String; I)V

时间:2016-06-11 19:07:17

标签: java hibernate logging glassfish-4.1

我正在部署使用Maven构建的EAR应用程序,该应用程序在其中一个模块中具有以下依赖关系:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>5.1.0.Final</version>
</dependency>

当我尝试在 Glassfish Server 4.1 中部署应用程序时,出现以下错误:

Fatal:   java.lang.NoSuchMethodError: org.jboss.logging.Logger.debugf(Ljava/lang/String;I)V
        at org.hibernate.internal.NamedQueryRepository.checkNamedQueries(NamedQueryRepository.java:149)

我做了一些研究来解决这个问题并做了以下尝试:

第一次尝试

我找到this question并使用this article中的脚本来清理Glassfish的osgi-cache,如问题和Glassfish / Payara Github存储库的this issue中所述。重启服务器。同样的错误。

第二次尝试

我找到this question并尝试了第一个答案的建议,如下所示:查看依赖关系树,我发现hibernate-entitymanager具有以下依赖关系:

<dependency>
    <groupId>org.jboss.logging</groupId>
    <artifactId>jboss-logging</artifactId>
    <version>3.3.0.Final</version>
    <scope>compile</scope>
</dependency>

所以我搜索了我的服务器安装程序并找到了jboss-logging.jar。安装的版本是3.1.0-GA(我现在不确定,但肯定是以前版本的依赖项)。我从Maven Central Repository下载了jboss-logging-3.3.0.Final.jar并替换了我的服务器安装中的org.jboss.logging.provider=slf4j。重启服务器。同样的错误。

第三次尝试

上一篇文章(以及其他文章)中的一些评论建议添加属性<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.21</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.21</version> <scope>test</scope> </dependency> ,因为我正在使用这些依赖项进行日志记录:

.properties

我在/glassfish/domains/domain1/config/文件夹中找到了一些-Dorg.jboss.logging.provider=slf4j文件,但它们都没有包含这样的属性,我不知道在哪个文件中添加该属性。我还在管理控制台中进行了一些搜索,但我没有找到添加属性的位置。我发现的唯一日志配置是配置日志记录级别。

之后我找到了在管理控制台中为Glassfish服务器添加一些JVM选项的地方,并添加了jboss-logging作为选项,但对我不起作用(更多,我不得不重新启动计算机才能获得Glassfish)在地面零点)

第四次尝试

在此之前,我遇到了一个问题并在StackOverflow中提出了另一个问题。在该帖子中由this comment引导我更改了项目配置但没有发生任何事情(我通过稍微改变我的依赖关系来解决了这个问题,答案仍然未决)

在所有的尝试之后,我的想法已经用完了,问题仍然存在。我不知道会出现什么问题。任何指导,帮助或答案将非常感谢。如果有人需要更多有关情况的详细信息,请告诉我。

提前感谢您的合作。

编辑1

我正在搜索并找到this article,其中的内容与我的内容类似,并添加了<dependency> <groupId>org.jboss.logging</groupId> <artifactId>jboss-logging</artifactId> <version>3.3.0.Final</version> <scope>provided</scope> </dependency> 提供的依赖关系:

pi = {3,0,1,2}

但错误仍然存​​在。显然它是服务器的东西,但我无法弄清楚是什么。我正在使用 GlassFish Server开源版4.1(版本13)

3 个答案:

答案 0 :(得分:1)

我使用JBoss服务器7.1来部署我的项目。在我的情况下,这个错误是由于我在我的项目中使用jboss-logging-3.3.0.Final.jar但JBoss 7有一个jboss-logging-3.1.0.GA.jar(/ opt / jboss-as-7.1.1.Final/modules/org/jboss/logging/main/)默认情况下。所以,可能是由于jar冲突或jboss-logging-3.1.0.GA.jar中没有方法,我不确定。但是用jboss-logging-3.3.0.Final.jar替换jboss-logging-3.1.0.GA.jar并更改module.xml中的映射(在上面提到的相同位置),如下所示

<module xmlns="urn:jboss:module:1.1" name="org.jboss.logging">
    <resources>
        <resource-root path="jboss-logging-3.3.0.Final.jar"/>
        <!-- Insert resources here -->
    </resources>
    <dependencies>
        <module name="org.jboss.logmanager"/>
    </dependencies>
</module>

错误消失了。希望它有所帮助。

答案 1 :(得分:0)

这是因为GlassFish附带了早期版本的JBoss Logging,这是由您的应用程序选择的,因此NoSuchMethod错误。 GlassFish 4.1附带的JBoss Logging版本没有定义方法。您可以尝试在glassfish的modules目录中替换jboss-logging的版本,这可能会或可能不会起作用,但看起来您尝试过这种方法并失败了。

另一种选择是升级到JBoss Logging 3.3.0.Final附带的最新Payara 4.1.1.162。

答案 2 :(得分:0)

阻止Glassfish在提供项目lib时使用自己的lib

只需在glassfish-web.xml目录中创建一个WEB-INF文件即可。该文件的内容如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd">
<glassfish-web-app>
     <class-loader delegate="false"/>
</glassfish-web-app>

这确保了glassfish不会加载它的内部库,而是加载项目中的库。