我正在将 Spring MVC 应用程序从 Spring 3.1 升级到 4.3,并将 Hibernate 3.6 升级到 5.2。我将在 Wildfly 8 中运行它。依赖项由 Maven 管理。
Spring 使用 commons-logging,它查看应用程序的类路径并尝试选择合适的日志记录框架。就我而言,它似乎选择了错误的那个。我在 pom.xml 中包含了 log4j,并检查了依赖层次结构,我可以看到 jboss-logging 不存在。这是我收到的错误消息:
Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.jboss.logging.Logger.debugf
因此,即使我的项目中没有 jboss 日志记录,commons-logging 也会在某个地方找到它并尝试使用它,但没有成功。经过一番搜索,我在 Wildfly 中找到了 jboss-logging-3.1.4.GA.jar。
错误的原因是这是旧版本的 jboss-logging。我向服务器添加了一个较新的 jar 并编辑了 module.xml 以指向它,错误就消失了。这证明 commons-logging 正在服务器上找到 jboss-logging。
问题是我不想要 jboss-logging,我想要 log4j。如何强制 commons-logging 使用 log4j 并忽略服务器上的内容?
编辑:我按照 chrisharm 提出的链接并将这些行添加到standalone.xml 文件中:
<add-logging-api-dependencies value="false"/>
<use-deployment-logging-config value="false"/>
我还更改了 module.xml 以再次指向旧 jar,因为如果使用 jboss,我宁愿看到错误。当我现在运行时,我得到了这个:
Caused by: java.lang.NoClassDefFoundError: org/jboss/logging/Logger
这可能是朝着正确方向迈出的一步,因为现在 Spring 无法访问 jboss-logging,但出于某种原因它仍在尝试使用它。