配置AppContextListener类

时间:2016-07-24 23:38:29

标签: java eclipse tomcat tomcat7

我在Windows 64位计算机Java 7上运行Tomcat 7.0.70和Eclipse Kepler。当我从Eclipse运行它时,我的软件工作正常,但是只有在将项目部署到Tomcat时才会出现以下错误,将我的项目导出到WAR文件后:

SEVERE: Error configuring application listener of class com.crafy.controller.AppContextListener java.lang.ClassNotFoundException: com.crafy.controller.AppContextListener.

AppContextListener是我自己的文件,它实现了ServletContextListener。这是文件的一部分,我删除了除contextInitialized()之外的所有内容,在那里,除了print语句之外我删除了所有内容(contextInitialized()根本没有被调用):

package com.crafy.controller;


@WebListener
public class AppContextListener implements ServletContextListener {


    public void contextInitialized(ServletContextEvent servletContextEvent) {

        SessionFactory sessionFactoryInst = null;

        System.out.println("Database connection initialized for Application.");

    }



}

当我从Eclipse运行它时,整个应用程序运行正常(右键单击“localhost上的Tomcat v7.0服务器”并单击“启动”)。另外,我得到上述错误的地方是我尝试使用WAR文件时。要获取WAR文件,我从Eclipse导出(通过转到文件 - >导出 - > WAR文件)。然后我将WAR文件放入文件夹:C:\ Program Files \ Apache Software Foundation \ Tomcat 7.0 \ webapps。当我转到IP地址(http://192.168.1.154:8080/crafy)时,该站点出现,但我无法访问由我的AppContextListener初始化的数据库。但是,它没有初始化,因为找不到类。

以下是我的应用程序特定web.xml的相关部分(位于C:\ Program Files \ Apache Software Foundation \ Tomcat 7.0 \ webapps \ crafy \ WEB-INF \ web.xml):

    <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
  <display-name>crafy</display-name>
  <welcome-file-list>
    <welcome-file>home.jsp</welcome-file>
  </welcome-file-list>


    <servlet>
        <servlet-name>videoSession</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>videoSession</servlet-name>
        <url-pattern>/videoSession.jsp</url-pattern>
        <url-pattern>/videoSession.html</url-pattern>
    </servlet-mapping>

    <resource-env-ref>
       <description>Transactions</description>
       <resource-env-ref-name>UserTransaction</resource-env-ref-name>
       <resource-env-ref-type>javax.transaction.UserTransaction</resource-env-ref-type>
    </resource-env-ref>

    <listener>
        <listener-class>com.crafy.controller.AppContextListener</listener-class>
    </listener>


</web-app>

AppContextListener.class文件确实存在于: C:\ Program Files \ Apache Software Foundation \ Tomcat 7.0 \ webapps \ crafy \ WEB-INF \ classes \ com \ crafy \ controller

我已尝试检查并更改多个不同内容中的路径,并尝试将AppContextListener.class文件移动到不同的位置,如Apache: Error configuring application listener中所示。我还尝试删除Eclipse IDE上的服务器再次创建它,然后再次按照同一链接中的建议导出到WAR。这没有解决任何问题。我还尝试了Eclipse中Tomcat服务器的“Clean Tomcat Work Directory ...”和“Clean ...”(参见ClassNotFoundException with ServletContextlistenerServletContextListener SEVERE: Error configuring application listener of class marktest.Config建议同时清理),然后再次导出为war。我也尝试了这篇文章中的多个建议:SEVERE: Error configuring application listener of class org.apache.catalina.deploy.ApplicationListener。没有一个成功。

我知道正在访问特定于应用程序的web.xml,因为如果我完全删除它,那么当我转到URL时,它会转到index.jsp而不是web中指定的home.jsp。 XML。所以,我在标签中提供的类路径肯定有问题,但是,我似乎已经尝试了所有但仍然无法找到它。就像我说的,当我从Eclipse运行服务器时,一切正常。我尝试镜像Eclipse使用的相同文件夹结构。具体来说,Eclipse项目的文件夹结构是:

  

base / crafy / WebContent / WEB-INF / ----&gt;包含web.xml并包含jsp和lib文件夹   base / crafy / target / classes / com / crafy / controller ----&gt;包含   AppContextListener.class

但是,当war文件部署到Tomcat时,文件夹结构为:

  

C:/ Program Files / Apache Software Foundation / Tomcat 7.0 / webapps / crafy / WEB-INF / ----&gt;包含web.xml并包含jsp和lib AND classes文件夹,以便AppContextListener.class文件位于webapps / crafy / WEB-INF / classes / com / crunchify / controller

Eclipse和直接部署到Tomcat之间的相对位置略有不同,我试图进行更改以使它们等效,但它似乎没有帮助。

我之前也使用过Tomcat 7.0.68,它有同样的问题,这促使我将最新的Tomcat版本安装到7.0.70,但这也产生了同样的问题。

有没有人对我如何进一步调试有任何建议?非常感激任何的帮助。我花了很多时间试图诊断这个问题,请帮助!!

2 个答案:

答案 0 :(得分:0)

在花费大量时间尝试将上述内容用于Tomcat 7.0之后,我没有成功。但是,我安装了Tomcat 8.0(版本8.0.36),并使用了与我在Tomcat 7.0上使用的完全相同的设置(它不适用于Tomcat 7.0),并且它可以工作(在8.0上) )。然后在将我的项目导出到WAR文件并将其移动到Tomcat 8.0 webapps文件夹之后,它立即调用了contextInitialized(),因为我一直试图在7.0上工作。解决方法只是安装和使用Tomcat 8而不是Tomcat 7.这仍然无法解释为什么Tomcat 7.0中使用的相同过程不起作用。我没有看到任何人回复我的查询来解释这种行为或本网站上的任何地方。如果除了使用Tomcat 8.0之外还有解决此问题的方法,请发布。否则,此解决方法适用于我。

答案 1 :(得分:0)

您能否检查类是否已在webapps位置(您的案例WEB-INF / classes / com / crafy / controller / AppContextListener.class)中正确提取。

可能是在部署时未将类正确提取到该位置。