【发布时间】:2016-11-28 05:10:25
【问题描述】:
我在 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 运行它时,整个应用程序运行良好(右键单击“Tomcat v7.0 Server at localhost”并单击“开始”)。另外,当我尝试使用 WAR 文件时,会出现上述错误。为了获取 WAR 文件,我从 Eclipse 导出(通过转到 File -> Export -> WAR File)。然后我将 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 ServletContextlistener 和 ServletContextListener 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/ ----> 包含 web.xml 并包含 jsp 和 lib 文件夹 基础/crafy/target/classes/com/crafy/controller ----> 包含 AppContextListener.class
但是,war文件部署到Tomcat时,文件夹结构是:
C:/Program Files/Apache Software Foundation/Tomcat 7.0/webapps/crafy/WEB-INF/ ----> 包含 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,但这也产生了同样的问题。
有人对我如何进一步调试有任何建议吗?非常感激任何的帮助。我已经花了很多时间试图诊断这个问题,请帮助!
【问题讨论】:
-
您已使用
maven标记此内容。您是否使用 maven 构建您的 WAR 文件? -
我创建 WAR 文件的方式是从 Eclipse 执行 File --> Export --> WAR File。我在 Eclipse 中使用 maven 进行 jar 文件/库管理,但这可能与手头的问题无关。原谅我,如果 maven 混淆了,我可以删除它作为标签。
标签: java eclipse tomcat tomcat7