【问题标题】:How can I find the error when Tomcat fails to start my Spring/Hibernate web application?当 Tomcat 无法启动我的 Spring/Hibernate Web 应用程序时,如何找到错误?
【发布时间】:2010-11-09 04:28:22
【问题描述】:

我有一个 Spring/Hibernate 应用程序,我已将其转换为 Web 应用程序,以便提供 RESTful Web 服务(使用 Jersey)。我正在尝试将 Web 应用程序部署到 Tomcat 6.0.20 上,但在日志文件中只收到一条神秘的错误消息:

Jul 8, 2009 2:25:22 PM org.apache.catalina.core.StandardContext start
SEVERE: Error listenerStart
Jul 8, 2009 2:25:22 PM org.apache.catalina.core.StandardContext start
SEVERE: Context [/lmrest] startup failed due to previous errors

我已将我的日志记录级别设置为调试,但没有任何可疑消息显示出了什么问题,除了这条,这对我来说看起来很无害:

1360 [http-8080-1] INFO  org.hibernate.cfg.search.HibernateSearchEventListenerRegister  - Unable to find org.hibernate.search.event.FullTextIndexEventListener on the classpath. Hibernate Search is not enabled.

我正在使用最新版本的 Spring 和 Hibernate。我在 web.xml 中使用 ContextLoaderListener。这可能是无法启动的侦听器吗?我假设它至少部分运行,因为我可以看到许多 Hibernate 配置日志消息在 Web 应用程序启动失败之前滚动过去。我的主要问题是我看不到任何错误消息,表明它抱怨的侦听器启动失败。

我正在使用的 web.xml 如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                   http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

    <!-- listener to pull in the Spring application context -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:appContext.xml</param-value>
    </context-param>

    <!-- Jersey servlet container to intercept all URIs -->
    <servlet>
        <servlet-name>JerseyContainer</servlet-name>
        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>JerseyContainer</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

如果有人能给我一些关于在哪里寻找我的错误的想法,我会非常感激,因为我很难过。提前致谢!

--詹姆斯

【问题讨论】:

  • 您能否发布您的 web.xml 的相关 部分?它可能会指示出了什么问题。
  • 是的,谢谢,现在已将其添加到问题文本中。

标签: java hibernate spring tomcat web.xml


【解决方案1】:

ubuntu 12.04下,tomcat7系统日志存放在/var/lib/tomcat7/localhost.&lt;date&gt;.log

此位置由/etc/tomcat7/logging.properties控制:

handlers = 1catalina.org.apache.juli.FileHandler, 2localhost.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler

.handlers = 1catalina.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler

############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################

1catalina.org.apache.juli.FileHandler.level = FINE
1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.FileHandler.prefix = catalina.

2localhost.org.apache.juli.FileHandler.level = FINE
2localhost.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
2localhost.org.apache.juli.FileHandler.prefix = localhost.

java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

############################################################
# Facility specific properties.
# Provides extra control for each logger.
############################################################

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = 2localhost.org.apache.juli.FileHandler

由于启动失败是由于 Tomcat 错误而不是应用程序错误,因此详细报告就在这里结束了。就我而言,Tomcat 抱怨缺少类定义。

SEVERE: Error configuring application listener of class com.foo.security.tomcat.CustomSessionListener
java.lang.ClassNotFoundException: com.alleni.zebra.security.tomcat.CustomSessionListener

【讨论】:

    【解决方案2】:

    可能是类路径,或者没有加载的东西。正如其他人所说,让日志记录正常工作。

    1) 我推荐使用“二分查找”方法来查找故障。注释掉 web.xml 中的“Jersey”部分。看看它是否有效(或至少启动)。

    2) 如果没有,注释掉 Spring ContextLoaderListener。看看它是否有效。

    3) 找到有问题的项目后,您可以“二进制搜索”到它的配置文件中——注释掉一半的配置等,直到找到有问题的部分或类参考。

    如果删除 web.xml 的两个/所有部分,并且您的上下文仍然无法加载。请查看 Tomcat/Catalina 上下文侦听器和服务器配置。

    【讨论】:

      【解决方案3】:

      Here 是 SprinSource 论坛上的类似讨论。由于 applicationContext.xml 使用标准 JAR,这很可能是类路径问题。仔细检查 WEB-INF/lib 文件夹,确保 Tomcat 的共享文件夹中没有冲突的 jar。

      【讨论】:

        【解决方案4】:

        请执行以下操作:

        • 从您的 war 文件中删除所有与 log4j 相关的工件 - 包括 log4j.jar/properties/xml;
        • 在 common/lib 或 lib 中包含 log4j.jar(取决于您的 Tomcat 版本);
        • 在 common/classes 中添加 log4j.properties 文件(在 Tomcat 6 上不确定)。

        此配置应确保正确定向所有 log4j 输出。如果需要,切换到调试,但它不应该是:

        log4j.rootLogger=info, R 
        
        log4j.appender.R=org.apache.log4j.RollingFileAppender 
        log4j.appender.R.File=${catalina.home}/logs/catalina.out 
        log4j.appender.R.MaxFileSize=10MB 
        log4j.appender.R.MaxBackupIndex=10 
        log4j.appender.R.layout=org.apache.log4j.PatternLayout 
        log4j.appender.R.layout.ConversionPattern=%d %p %t %c - %m%n 
        

        【讨论】:

        • 这个对我有用。至少它可以帮助您找到真正的原因!谢谢罗伯特!
        • 谢谢,谢谢。我正在把头发拉出来。
        【解决方案5】:

        Apache 找不到类 org.hibernate.cfg.search.HibernateSearchEventListenerRegister。 您确定启动休眠所需的所有类都加载到类路径中吗? Hibernate分为很多.jar包,建议你检查一下.jar文件之间的依赖关系

        【讨论】:

        • 如果你使用的是 maven,你不需要为管理依赖做太多事情,因为这是 maven 著名的事情之一。
        • 是的,我正在使用 Maven。奇怪的是,当我在命令行上运行这个 Spring 应用程序上下文(打包为 JAR)时,它启动得很好,但是当它部署在 Tomcat 中(打包为 WAR)时,它有时会失败。如果从主类中调用应用程序上下文是有效的,通过'new ClassPathXmlApplicationContext(“appContext.xml”)'那么当它由Tomcat通过ContextLoaderListener和使用相同的contextConfigLocation参数启动时它的行为不应该相同确切的应用程序上下文 XML?
        • 也许 Maven 如何在 JAR 和 WAR 工件中组织类之间存在一些差异,这会导致此问题?我正在使用 shade 插件,以便在最终工件中包含所有依赖项 JAR,当我将应用程序打包为 JAR 时,我会看到 JAR 中包含的依赖项的实际类文件,而当我将应用程序打包为 WAR 时,我而是查看 WEB-INF/lib 下包含的依赖项 JAR。这有可能造成某种不良影响吗?我是否过多地认为我的原始应用程序上下文 XML 文件应该在 Tomcat 中也能正常工作?
        【解决方案6】:

        检查您的 log4j.properties 或 log4j.xml 并确保您的日志记录级别设置为 DEBUG

        【讨论】:

        • 是的,如上所述,我已经这样做了,但不幸的是,除了前面提到的 INFO 消息之外,没有看到任何错误,这表明在类路径上找不到 FullTextIndexEventListener 类。但是在 WAR 中,我可以在 WEB-INF/lib 中看到以下 Hibernate JAR:hibernate-3.2.6.ga.jar hibernate-annotations-3.4.0.GA.jar hibernate-commons-annotations-3.1.0.GA。 jar hibernate-core-3.3.0.SP1.jar hibernate-validator-3.0.0.ga.jar
        • 有趣的是,当我搜索 FullTextIndexEventListener 类时,我在 hibernate-annotations-3.2.1.ga.jar 中找到它,但在我的 pom.xml(以及生成的 WAR 工件中)我有该依赖项的更高版本(版本 3.4.0.GA)。也许存在一些向后兼容性问题,即新版本中不再存在该类?
        【解决方案7】:

        日志中是否有任何错误(在较早的时间点)?这没什么好说的(尽管如果是这样的话我不会感到惊讶)。

        【讨论】:

        • 不幸的是,这是唯一作为错误跳出的内容,即使它被列为 INFO 级别的日志消息。几乎所有的 DEBUG 消息都涉及 Hibernate 注释绑定,所有这些似乎都在报告成功的操作。
        猜你喜欢
        • 2017-10-09
        • 1970-01-01
        • 2022-07-26
        • 2020-07-28
        • 2021-04-25
        • 1970-01-01
        • 2017-11-09
        • 2023-03-07
        • 2011-04-11
        相关资源
        最近更新 更多