即使类在包中,也无法从tomcat服务器运行我的servlet

时间:2011-01-07 00:57:18

标签: tomcat servlets servletexception

我正在尝试让我的servlet运行,我一直在寻找2天并尝试所有可能的解决方案而没有运气。 servet类位于相应的文件夹中(即包名称下)。 我还将我的servlet中需要的jar文件添加到lib文件夹中。 web.xml文件映射url并定义servlet。 所以我在文档中做了所有事情,wt人们在这里说并仍然收到此错误:

    type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: Error instantiating servlet class assign1a.RPCServlet
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:108)
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:558)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:379)
    org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:282)
    org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:357)
    org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1687)
    java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    java.lang.Thread.run(Thread.java:619)
root cause

java.lang.NoClassDefFoundError: assign1a/RPCServlet (wrong name: server/RPCServlet)
    java.lang.ClassLoader.defineClass1(Native Method)
    java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
    java.lang.ClassLoader.defineClass(ClassLoader.java:616)
    java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
    org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2820)
    org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1143)
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1638)
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1516)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:108)
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:558)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:379)
    org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:282)
    org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:357)
    org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1687)
    java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    java.lang.Thread.run(Thread.java:619)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.5 logs.

这也是我的servlet代码:

package assign1a;

import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import lib.jsonrpc.RPCService;

public class RPCServlet extends HttpServlet {

        /**
         * 
         */
        private static final long serialVersionUID = -5274024331393844879L;


        private static final Logger log = Logger.getLogger(RPCServlet.class.getName());

        protected RPCService service = new ServiceImpl();

        public void doGet(HttpServletRequest request, HttpServletResponse response)
                        throws IOException, ServletException {
                response.setContentType("text/html");
                response.getWriter().write("rpc service " + service.getServiceName() +  " is running...");
        }

        public void doPost(HttpServletRequest request, HttpServletResponse response)
                        throws IOException, ServletException {

                try {
                        service.dispatch(request, response);
                } catch (Throwable t) {
                        log.log(Level.WARNING, t.getMessage(), t);
                }
        }

}

请帮帮我:) 感谢。

编辑:这是我的web.xml文件的内容

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  version="3.0"
  metadata-complete="true">  


    <servlet>
        <servlet-name>jsonrpc</servlet-name>
        <servlet-class>assign1a.RPCServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>jsonrpc</servlet-name>
        <url-pattern>/rpc</url-pattern>
    </servlet-mapping>

</web-app>

3 个答案:

答案 0 :(得分:4)

我在错误消息中注意到了短语(wrong name: server/RPCServlet)

这通常意味着类文件的包名与jar / war中的目录结构不同。

也许您最初将RPCServlet.java置于名为server的目录下,然后将RPCServlet.java移至assign1a

或许原始包定义为:

package server;

然后你将其改为

package assign1a;

无论哪种方式,为了解决它,我建议你删除所有编译的东西(类文件,war文件等)。停止tomcat,然后删除<TOMCAT_HOME>/work目录,以确保一切都消失。

然后,检查以确保RPCServlet.java位于名为assign1a的文件夹中,并确保将包定义为:

package assign1a;

重新编译/重建战争,你应该处于更好的状态。也许尝试在Eclipse(或Netbeans)中构建战争,因为这样就不会让你编译成与类文件包名称不匹配的文件夹。

祝你好运。 - 戴夫

答案 1 :(得分:2)

你的错误“noclassdeffound”意味着tomcat在需要时找不到assign1a.RPCServlet。为了让tomcat找到有问题的类,它必须在tomcat的类路径上。把它放在那里的最好方法是确保它在classes-folder中。然而,找到这个文件夹可能有点棘手D:有几种可能性,取决于你所使用的系统,你如何开发,以及你如何部署。

首先查看名为webapps的文件夹下的tomcat安装文件夹。在那里,找到名为[context]的文件夹,如您的网址 http://localhost:8080/ [context] / rpc。你看?该文件夹必须命名为您正在使用的网址。 (提供确切的帮助会更容易,如果您提供了确切的信息,那么在不知道您正在使用的网址的情况下会很难。)在此文件夹中,找到文件夹WEB-INF,然后,你应该找到一个名为classes的文件夹。在此文件夹下,您必须有一个名为assign1a的文件夹,并且在那里您必须具有文件RPCServlet.class,这是已编译的文件。

所以,摘要简称:[tomcat_install_folder] / webapps / [context] /WEB-INF/classes/assign1a/RPCServlet.class缺失。哦,正斜杠当然是Windows上的反斜杠:)

使用动态网络项目进行eclipse

另外,如果您在eclipse中开发,并且在eclipse中使用tomcat服务器,那么您的tomcat文件夹实际上位于完全不同的位置。然后你可以在你的eclipse工作区,文件夹.metadata / .plugins / org.eclipse.wst.server.core / tmp0 / wtpwebapps / [context]中找到它,其中tmp0可以是tmp1或其他东西,具体取决于tomcat服务器的数量你已经在你的eclipse工作区启动了。

如果您仍然无法弄明白,请发布有关您的设置的更多信息(即开发ide,部署方案,访问网址,web.xml)

答案 2 :(得分:0)

java.lang.NoClassDefFoundError: assign1a/RPCServlet (wrong name: server/RPCServlet)

您在WAR中的/ WEB-INF / classes下是否看到名为/ assign1a的文件夹?它是否包含名为RPCServlet.class的文件?如果没有,你必须编译你的servlet。

发布您的web.xml并显示您的<servlet><servlet-mapping>条目。