Java 当Tomcat无法启动Spring/Hibernate web应用程序时,如何找到错误?

Java 当Tomcat无法启动Spring/Hibernate web应用程序时,如何找到错误?,java,hibernate,spring,tomcat,web.xml,Java,Hibernate,Spring,Tomcat,Web.xml,我有一个Spring/Hibernate应用程序,为了提供RESTfulWeb服务(使用Jersey),我将其转换为web应用程序。我试图将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.ca

我有一个Spring/Hibernate应用程序,为了提供RESTfulWeb服务(使用Jersey),我将其转换为web应用程序。我试图将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
我已将日志记录级别设置为debug,但没有显示出错原因的可疑消息,除了这条消息,这条消息对我来说非常无害:

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>

org.springframework.web.context.ContextLoaderListener
上下文配置位置
类路径:appContext.xml
球衣集装箱
com.sun.jersey.spi.container.servlet.ServletContainer
1.
球衣集装箱
/*
如果有人能给我一些关于在哪里寻找我的错误的想法,我将非常感激,因为我被难倒了。提前谢谢


--James

日志中是否有进一步的错误(在较早的时间点)?这没什么大不了的(如果是这样的话,我也不会感到惊讶)。

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

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

请执行以下操作:

  • 从war文件中删除所有与log4j相关的工件-包括log4j.jar/properties/xml
  • 在common/lib或lib中包含log4j.jar(取决于您的Tomcat版本)
  • 在common/classes中添加log4j.properties文件(在Tomcat6上不确定)
此配置应确保所有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 

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

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

1) 我建议使用“二进制搜索”方法来查找故障。注释掉web.xml中的“Jersey”部分。看看它是否工作(或至少启动)

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

3) 一旦找到有问题的项,就可以对其配置文件进行“二进制搜索”——注释掉一半的配置,等等,直到找到有问题的节或类引用


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

在ubuntu 12.04下,tomcat7系统日志存储在
/var/lib/tomcat7/localhost..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

您可以发布web.xml的相关部分吗?它可能会指示出哪里出了问题。是的,谢谢,这已经添加到问题文本中。如果您使用maven,您就不需要在管理依赖项方面做太多工作,因为这是maven的著名之处之一。是的,我正在使用maven。奇怪的是,当我在命令行(打包为JAR)运行这个Spring应用程序上下文时,它启动得很好,但当它部署在Tomcat(打包为WAR)中时,它会在某个点失败。如果通过“new ClassPathXmlApplicationContext”(“appContext.xml”)从主类中调用时应用程序上下文有效'那么,当Tomcat通过ContextLoaderListener和contextConfigLocation参数启动它时,它的行为不应该是相同的吗?它使用相同的应用程序上下文XML?Maven在JAR中组织类的方式和导致此问题的WAR工件之间可能存在一些差异?我使用shade插件是为了在最终工件中包含所有依赖项JAR,当我将应用程序打包为JAR时,我看到JAR中包含的依赖项的实际类文件,而当我将应用程序打包为WAR时,我看到的是WEB-INF/lib中包含的依赖项JAR。这是否可能造成某种不良影响?我是否认为我的orig app context XML文件在Tomcat中也能正常工作?是的,如上所述,我已经这样做了,但不幸的是,除了前面提到的信息消息之外,没有看到任何错误,该消息指示在类路径上找不到FullTextIndexEventListener类。然而,在战争中,我可以在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.0.ga.jar有趣的是,当我搜索FullTextIndexEventListener类时,我在hibernate-annotations-3.2.1.ga.jar,但在我的pom.xml(以及由此产生的WAR工件)中,我有一个更高版本的依赖项(版本3.4.0.ga)。可能存在一些向后兼容性问题,例如t