【问题标题】:get NoClassDefFoundError with log4j, commons logging and tomcat 7 when trying to use log4j in webapp尝试在 webapp 中使用 log4j 时,使用 log4j、commons logging 和 tomcat 7 获取 NoClassDefFoundError
【发布时间】:2014-04-16 18:20:55
【问题描述】:

我正在开发一个包含多个 web 应用程序的 Java/J2EE 项目。我想在一些 webapps 中引入 log4j。 所以我在WEB-INF\lib 中添加了log4j-1.2.16.jar,在WEB-INF\classes 中添加了log4j.properties

结果我得到一个 NoClassDefFoundError

org.apache.commons.logging.LogConfigurationException:org.apache.commons.logging.LogConfigurationException: No suitable Log constructor [Ljava.lang.Class;@f8f541 for org.apache.commons.logging.impl.Log4JLogger (Caused by java.lang.NoClassDefFoundError: org/apache/log4j/Category) (Caused by org.apache.commons.logging.LogConfigurationException: No suitable Log constructor [Ljava.lang.Class;@f8f541 for org.apache.commons.logging.impl.Log4JLogger (Caused by java.lang.NoClassDefFoundError: org/apache/log4j/Category))
    at org.apache.commons.logging.impl.LogFactoryImpl.newInstance(LogFactoryImpl.java:543)
    at org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:235)
    at org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:209)
    at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:351)

当我尝试直接在 Tomcat 中安装 log4j 时,我得到了同样的错误。 (我已经在 tomcat/lib 等中添加了propers jars ......就像这里所说的:http://tomcat.apache.org/tomcat-7.0-doc/logging.html#Using_Log4j

我发现该错误可能来自类加载器问题,因为第 3 方中包含一个 commons.logging jar。事实上,当我在第 3 方删除这个 jar 时,NoClassDefFoundError 消失了。 ([第 3 方]/Bin/commons-logging-1.0.4.jar)。

但是我不能把罐子从第 3 方拿走,它是在别处使用的。

是否可以将公共日志配置为在加载时忽略 log4j,或者是否有其他方法可以解决这个类加载器问题?

我尝试使用log4j-1.2.16.jar,第3方包含commons-logging-1.0.4.jar。我的 log4j.properties 文件是 apache 在上一个链接中建议的默认文件。

【问题讨论】:

    标签: java log4j tomcat7 classloader apache-commons-logging


    【解决方案1】:

    在您的 proguard 中添加以下定义。 这肯定会解决的

    -keep class com.amazonaws.org.apache.commons.logging.** { *; }
    

    【讨论】:

      【解决方案2】:

      您需要重新阅读您引用的文件。

      引用http://tomcat.apache.org/tomcat-7.0-doc/logging.html#Using_Log4j

      注意:当您想要重新配置 Tomcat 以使用 Apache log4j 进行自己的日志记录时,需要执行本节中描述的步骤。如果您只想在自己的 Web 应用程序中使用 log4j,则不需要这些步骤。 — 在这种情况下,只需将 log4j.jar 和 log4j.properties 放入 Web 应用程序的 WEB-INF/lib 和 WEB-INF/classes 中。

      【讨论】:

      • "只需将 log4j.jar 和 log4j.properties 放入您的 Web 应用程序的 WEB-INF/lib 和 WEB-INF/classes" 我试过了,我得到了同样的错误
      • 然后更新您的问题以反映这一点,并明确您所指的各种 JAR 的位置。
      • 你认为我现在的问题可以吗?
      猜你喜欢
      • 2010-09-18
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 2012-04-08
      • 1970-01-01
      • 1970-01-01
      • 2012-12-17
      相关资源
      最近更新 更多