【问题标题】:Does log4j requires JSF jars?log4j 需要 JSF jar 吗?
【发布时间】:2011-03-31 04:11:37
【问题描述】:

我构建了一个 REST Web 服务(使用 JAX-RS、Spring、Spring JMS 和 ActiveMQ)。我很惊讶当我将它部署到 Tomcat 5.5.23 时出现需要 JSF jar 的异常?!

Error configuring application listener of class org.apache.myfaces.webapp.StartupServletContextListener
java.lang.ClassNotFoundException: org.apache.myfaces.webapp.StartupServletContextListener
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1359)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1205)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3712)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4216)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:760)

在我在不同的类中添加 log4j 功能之前,Web 服务运行良好,这是我的 log4j.properties 文件(我将它放在 WEB-INF/classes 中):

log4j.rootCategory=INFO, S

log4j.logger.com.dappit.Dapper.parser=ERROR
log4j.logger.org.w3c.tidy=FATAL

#------------------------------------------------------------------------------
#
#  The following properties configure the console (stdout) appender.
#  See http://logging.apache.org/log4j/docs/api/index.html for details.
#
#------------------------------------------------------------------------------
log4j.appender.S = org.apache.log4j.ConsoleAppender
log4j.appender.S.layout = org.apache.log4j.PatternLayout
log4j.appender.S.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss} %c{1} [%p] %m%n

知道如何解决这个问题吗?

【问题讨论】:

  • 仅删除 log4j.properties 文件后,此错误会消失吗?
  • 如果我这样做,我会收到以下错误(启动 tomcat 时):log4j:WARN No appenders could be found for logger (org.apache.commons.digester.Digester.sax)。 log4j:WARN 请正确初始化 log4j 系统。 2010 年 8 月 17 日下午 12:24:22 org.apache.catalina.core.StandardContext 开始严重:错误 listenerStart
  • 如果我删除它,我会收到以下错误(启动 tomcat 时):log4j:WARN No appenders could be found for logger (org.apache.commons.digester.Digester.sax)。 log4j:WARN 请正确初始化 log4j 系统。 2010 年 8 月 17 日下午 12:24:22 org.apache.catalina.core.StandardContext 开始严重:错误 listenerStart

标签: java tomcat jsf log4j


【解决方案1】:

如果您在 web.xml 中有对 org.apache.myfaces.webapp.StartupServletContextListener 的引用,我希望看到这一点,例如:

<listener>
     <listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>
</listener>

你能确认不存在这样的元素吗?

【讨论】:

  • 我已将其删除,但我仍然收到:log4j:WARN 找不到记录器 (org.apache.commons.digester.Digester.sax) 的附加程序。 log4j:WARN 请正确初始化 log4j 系统。 2010 年 8 月 17 日下午 12:43:02 org.apache.catalina.core.StandardContext 开始严重:错误 listenerStart
  • 您是否添加了您的 log4j.properties 文件?你有 log4j jar WEB-INF/lib 吗?
  • 是的,我确实添加了 .properties 文件,但我的应用程序的 web-inf 中没有 log4j jar,因为我注意到 TOMCAT_HOME/shared/ 下有一个 log4j-1.2.8.jar库。我需要将它添加到我的 WEB-INF 文件夹吗?
  • 试一试 - 我隐约记得 log4j 有问题,除非 jar 实际上位于 Tomcat 上 webapp 的 WEB-INF/lib 文件夹中。
  • 我做了,但现在我得到:配置类 org.apache.myfaces.webapp.StartupServletContextListener 的应用程序侦听器时出错如果我添加 MyEclipse 在我的开发机器上引用的所有 JSF/JSTL jar,我得到这个异常:错误配置类 com.sun.faces.config.ConfigureListener java.lang.NoClassDefFoundError: javax/el/ExpressionFactory 的应用程序侦听器我就是不明白,为什么要使用 JSF?
【解决方案2】:

听起来像是类加载器层次结构问题。您应该将 log4j 包含在您的 WAR 文件中,而不是将其放在 Tomcat 的共享库中。

另外,我在 Tomcat 5.5 中遇到了一些问题,这些问题已在 Tomcat 6.0 中得到修复。您可能需要考虑升级。

【讨论】:

  • 这是某种类冲突问题:MyEclipse 自动将 JSTL 和 JSF jar 放在我的 lib 路径中,此外我注意到 JSTL 中有一个“Logger”类(org.apache.taglibs. standard.lang.jstl.Logger),一旦我使用完整的 apache log4j 包名(org.apache.log4j.Logger)声明了我的记录器类,它就起作用了!!
【解决方案3】:

按照提供的方式在 maven 中创建以下依赖项(如果存在): javax javaee-api 6.0 范围:提供

javax.servlet javax.servlet-api 3.0.1 范围:提供

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-27
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 2012-01-31
    相关资源
    最近更新 更多