【问题标题】:Problems deploying Spring 2 aplication in Apache Tomcat 6在 Apache Tomcat 6 中部署 Spring 2 应用程序的问题
【发布时间】:2011-04-03 02:41:38
【问题描述】:

我正在尝试启动 Spring 2 + Struts 2 + Hibernate 3 架构项目,但在 Eclipse(Helios 版本)内的 Apache Tomcat 6.0 中部署它时出现异常。

Tomcat 启动异常:

GRAVE: Error configurando escuchador de aplicación de clase org.springframework.web.context.ContextLoaderListener
java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1645)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1491)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4078)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4630)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:445)
    at org.apache.catalina.core.StandardService.start(StandardService.java:519)
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:581)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:616)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
24-ago-2010 12:22:04 org.apache.catalina.core.StandardContext listenerStart
GRAVE: Se ha saltado la instalación de escuchadores de aplicación debido a error(es) previo(s)
24-ago-2010 12:22:04 org.apache.catalina.core.StandardContext start
GRAVE: Error listenerStart
24-ago-2010 12:22:04 org.apache.catalina.core.StandardContext start
GRAVE: Falló en arranque del Contexto [/web] debido a errores previos

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="struts_blank" version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>Struts Blank</display-name>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring.xml</param-value>
    </context-param>

    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
</web-app>

我用谷歌搜索了很长时间,并尝试了一些可能的解决方案,但都没有奏效。 我将解释我尝试了什么以及获得的异常:

第一种方式: 在 Tomcat 服务器配置的类路径选项卡中,我在 Bootstrap Entries 部分添加了 spring-web-2.5.1.jar(与项目中使用的相同)作为外部 jar。 那么当Apache启动时触发这个异常

GRAVE: Error configurando escuchador de aplicación de clase org.springframework.web.context.ContextLoaderListener
java.lang.NoClassDefFoundError: javax/servlet/ServletContextListener
    at java.lang.ClassLoader.findBootstrapClass(Native Method)
    at java.lang.ClassLoader.findBootstrapClass0(ClassLoader.java:900)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:316)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:314)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1560)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1491)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4078)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4630)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:445)
    at org.apache.catalina.core.StandardService.start(StandardService.java:519)
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:581)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:616)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
24-ago-2010 12:42:36 org.apache.catalina.core.StandardContext listenerStart
GRAVE: Se ha saltado la instalación de escuchadores de aplicación debido a error(es) previo(s)
24-ago-2010 12:42:36 org.apache.catalina.core.StandardContext start
GRAVE: Error listenerStart
24-ago-2010 12:42:36 org.apache.catalina.core.StandardContext start
GRAVE: Falló en arranque del Contexto [/web] debido a errores previos

所以我以相同的位置和方式添加了 servlet-api-2.4.jar。然后我得到以下异常:

INFO: Starting Servlet Engine: Apache Tomcat/6.0.29
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:616)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
Caused by: java.lang.NoSuchMethodError: javax.servlet.ServletContext.getContextPath()Ljava/lang/String;
    at org.apache.catalina.core.StandardHost$MemoryLeakTrackingListener.lifecycleEvent(StandardHost.java:561)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4625)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:445)
    at org.apache.catalina.core.StandardService.start(StandardService.java:519)
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:581)
    ... 6 more

第二种方式: 在类路径选项卡中,我添加了我的项目,我得到了之前发布的相同异常 (java.lang.reflect.InvocationTargetException)。

为什么 Apache Tomcat 不能正确读取项目库?也许我忽略了某些东西,或者根本就出了什么问题。 你能帮我解决吗?我会提供你需要的所有信息。

欢迎任何帮助。

【问题讨论】:

    标签: spring exception deployment tomcat jakarta-ee


    【解决方案1】:

    我也遇到了这个问题。尝试使用 %TOMCAT_HOME%/lib/servlet-api.jar 而不是其他 jars(包含包 javax.servlet,例如 javaee.jar)重新编译您的项目。也许这可以解决您的问题。

    【讨论】:

      【解决方案2】:

      关于核心问题

      Caused by: java.lang.NoSuchMethodError: javax.servlet.ServletContext.getContextPath()Ljava/lang/String;
      

      这肯定是由于在您的类路径中某处有早期版本的 servlet-api.jar。我有完全相同的问题;我是由commons-logging 引起的。

      为了解决这个问题,我必须对我的 pom.xml 执行以下操作

      <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.1</version>
        <exclusions>
          <exclusion>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
          </exclusion>
        </exclusions>      
      </dependency>
      

      【讨论】:

        【解决方案3】:

        您不能在 tomcat Web 应用程序中包含 servlet-api jar。尝试删除它。

        【讨论】:

          【解决方案4】:

          将 jar 文件从 Eclipse 部署到 Tomcat 时出现问题。我确信有更好的方法来解决它,虽然我发现了它,但我解决了它,生成了 war 文件并将其部署在独立安装的 Apache Tomcat 上。

          【讨论】:

            【解决方案5】:

            您不能只添加 spring-web-2.5.1.jar 自己,您需要一堆其他 Spring JAR 来配合它,例如spring-corespring-beansspring-contextspring-context-support,也许还有spring-webmvc。更好的是,安全起见并使用多合一 spring.jar

            哦,Spring 2.5.1 是古老的。至少升级到 2.5.6,或者最好升级到 3.0.x。

            【讨论】:

            • 我只是将所有的库都包括在内,正如它在第二种方式中所解释的那样,但它仍然无法正常工作。感谢您的回复
            【解决方案6】:

            org.springframework.web.context.ContextLoaderListener 通过放入类导入来检查这一点...如果不可用,则添加适当的 jar..

            【讨论】:

            • 你是对的,但是当我将它包含在类路径中时,我得到了另一个异常,正如我在消息中所说的那样。感谢您的回复
            猜你喜欢
            • 2012-01-16
            • 2019-08-16
            • 2019-04-30
            • 2015-04-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-07-25
            • 2017-10-25
            相关资源
            最近更新 更多