【发布时间】:2011-02-27 08:48:26
【问题描述】:
昨天我创建了一个简单的图像 servlet 并尝试部署它。我在 JBoss 启动时遇到错误,然后在尝试调用 servlet 时遇到更多错误。
昨天我花了大约 8 个小时在网上搜索答案并尝试不同的场景。我最终使我的 JBoss 问题变得更糟,然后修复了它们,但我从来没有让 servlet 工作。
servlet 是 com.controller.MyImageServlet,如下所示:
package com.controller;
import javax.servlet.http.*;
/**
* Servlet implementation class MyImageServlet
*/
public class MyImageServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public MyImageServlet() {
super();
}
// Process the HTTP Get request
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/* ... */
}
}
我添加到 web.xml 的标签如下所示:
<servlet>
<servlet-name>ImageServlet</servlet-name>
<servlet-class>com.controller.MyImageServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ImageServlet</servlet-name>
<url-pattern>/CERTIMAGE/*</url-pattern>
</servlet-mapping>
在服务器启动时,这是日志中出现问题的唯一指示:
01:59:25,328 WARN [JAXWSDeployerHookPreJSE] Cannot load servlet class: com.controller.MyImageServlet
当我尝试 URL 模式 (http://localhost:9980/CERTIMAGE/1) 时,我在日志(和浏览器)中得到以下堆栈跟踪:
01:59:39,640 INFO [[/]] Marking servlet ImageServlet as unavailable
01:59:39,640 ERROR [[ImageServlet]] Allocate exception for servlet ImageServlet
java.lang.ClassNotFoundException: com.controller.MyImageServlet
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at org.jboss.web.tomcat.service.TomcatInjectionContainer.newInstance(TomcatInjectionContainer.java:262)
at org.jboss.web.tomcat.service.TomcatInjectionContainer.newInstance(TomcatInjectionContainer.java:256)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1006)
at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:777)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:129)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:190)
at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:92)
at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126)
at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:829)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:598)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)
如果我再次尝试 URL 模式,我会在日志中收到以下消息:
09:33:32,390 INFO [[ImageServlet]] Servlet ImageServlet is currently unavailable
我已验证 MyImageServlet.class 位于 WEB-INF/classes/com/controller 的 WAR 中。事实上,我什至在我的一个 JSP 中添加了一些代码来尝试实例化 Servlet 并调用 doGet 方法。这实际上有效,并将正确的调试序列输出到日志中,指示调用了 Servlet 构造函数和 doGet 方法。
我还尝试按照一些说明创建/部署一个非常简单的 HelloWorld servlet,但问题完全相同。请注意,web.xml 已经包含 JBoss 放在那里的一个 servlet:org.jboss.web.tomcat.service.StatusServlet —— Servlet 不会在日志中给出任何错误。作为一个实验,我从该路径中删除了“.web”,最终得到了与我在 Servlet 上完全相同的错误。因此,在给定指定路径的情况下,JBoss 似乎无法找到我的 Servlet。只是为了好玩,我尝试了各种其他路径,比如普通的 MyImageServlet、controller.MyImageServlet 等等。此外,该 servlet 最初命名为 ImageServlet,但我尝试更改名称,认为可能与现有 ImageServlet 存在冲突。在所有情况下,行为都是相同的。
经过我昨天的所有研究,我想说这似乎是 JBoss servlet 容器的问题,而且我还了解到 JBoss 5.1.0.GA 应该与 tomcat servlet 容器捆绑在一起。不到 2 个月前,我自己(来自 jboss.org)在我的 PC(Windows XP)上安装了 JBoss,并且几乎照原样使用它。请注意,我在 JDK 1.6 上运行,所以我确实使用了 jboss-jdk6 安装版本。我在 Windows 上运行,但我也部署到 Linux 虚拟专用服务器。我部署了我的程序的当前版本,包括 servlet 到 Linux 机器,但我得到了完全相同的错误。我不愿意尝试重新安装 JBoss,因为当我在两个完全不同的安装中遇到相同的错误时,很难将责任归咎于 JBoss 安装。
我对捆绑的 tomcat servlet 容器有点怀疑,因为使用 eclipse,我无法找到任何迹象表明 JBoss 中捆绑了 tomcat。我确实在 JBoss common/lib 目录中找到了 servlet-api.jar。这是在 Eclipse 构建路径上。
一个可能有用的注释:我以前使用独立的 tomcat 服务器用于使用相同 eclipse 的其他项目,所以也许这是某种 eclipse 问题?但是,正如我所说,当我部署到 Linux 服务器时,我确实遇到了同样的错误,并且该部署过程只涉及将文件 ftping 到服务器,然后将它们放入部署的 war 包并重新启动 JBoss。
感谢您提供的任何帮助。
【问题讨论】:
-
“我已验证 MyImageServlet.class 位于 WEB-INF/classes/com/controller/images 的 WAR 中。” 您能否查看此声明?
/images与实际包声明冲突... -
对不起,“图片”是一个错字。我会在问题陈述中解决这个问题。