昨天我创建了一个简单的图像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容器捆绑在一起。我在不到两个月前(来自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构建路径上。
一个可能有用的注意事项:我以前曾使用同一个eclipse的其他项目使用独立的tomcat服务器,所以也许是某种日食问题?但是,正如我所说,当我部署到Linux服务器时,我确实遇到了同样的错误,而且部署过程只涉及将文件写入服务器,然后将它们放入已部署的war包并重新启动JBoss。
感谢您提供的任何帮助。
答案 0 :(得分:1)
在过去几周处理类似问题之后,我现在回过头来向我过去的自己建议我尝试下列其中一项:
确保在eclipse部署中指定了源文件夹 装配(右键单击项目,选择“属性”,然后单击“确定” 部署大会)。
确保源文件夹包含在服务器类路径中 (双击服务器,单击“打开启动配置”,然后 选择ClassPath选项卡。
这个项目早已不复存在,所以我无法确定。