6

我试图让我的 servlet 运行,我已经搜索了 2 天并尝试了所有可能的解决方案,但没有运气。servet 类位于适当的文件夹中(即在包名下)。我还将 servlet 中所需的 jar 文件添加到 lib 文件夹中。web.xml 文件映射 url 并定义 servlet。所以我做了文档中的所有事情,人们在这里说,但仍然收到这个错误:

    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>
4

3 回答 3

4

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

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

也许你最初放在RPCServlet.java一个名为的目录下server,然后,后来移动RPCServlet.javaassign1a?

或者也许原始包定义为:

package server;

然后您稍后将其更改为

package assign1a;

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

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

package assign1a;

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

祝你好运。- 戴夫

于 2011-01-07T01:35:40.000 回答
2

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

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

因此,简而言之:缺少 [tomcat_install_folder]/webapps/[context]/WEB-INF/classes/assign1a/RPCServlet.class。哦,正斜杠当然是 Windows 上的反斜杠 :)

eclipse 与动态 web 项目

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

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

于 2011-01-07T01:22:29.660 回答
0
java.lang.NoClassDefFoundError: assign1a/RPCServlet (wrong name: server/RPCServlet)

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

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

于 2011-01-07T01:02:42.657 回答