1

我正在将 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,但出于某种原因它仍在尝试使用它。

4

1 回答 1

1

https://docs.jboss.org/author/display/WFLY8/How+To#HowTo-HowdoIusemyownversionoflog4j%3F

如果您需要/想要包含您的 log4j 版本,那么您需要执行以下两个步骤。

  1. 使用 add-logging-api-dependencies 属性禁用向所有部署添加日志记录依赖项并禁用 use-deployment-logging-config 属性或排除 jboss-deployment-structure.xml 中的日志记录子系统。
  2. 然后需要在您的部署中包含一个 log4j 库。

这仅适用于登录您的部署。服务器日志将继续使用日志子系统配置。

于 2017-01-18T16:51:49.157 回答