我正在部署使用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引导我更改了项目配置但没有发生任何事情(我通过稍微改变我的依赖关系来解决了这个问题,答案仍然未决)
在所有的尝试之后,我的想法已经用完了,问题仍然存在。我不知道会出现什么问题。任何指导,帮助或答案将非常感谢。如果有人需要更多有关情况的详细信息,请告诉我。
提前感谢您的合作。
我正在搜索并找到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)
答案 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不会加载它的内部库,而是加载项目中的库。