【问题标题】:Can't run my servlet from tomcat server even though the classes are in package即使类在包中,也无法从 tomcat 服务器运行我的 servlet
【发布时间】:2011-01-07 00:57:18
【问题描述】:

我正在尝试让我的 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>

【问题讨论】:

    标签: tomcat servlets servletexception


    【解决方案1】:

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

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

    也许您最初将RPCServlet.java 放在名为server 的目录下,然后将RPCServlet.java 移动到assign1a

    或者原包定义为:

    package server;
    

    然后你后来改成了

    package assign1a;
    

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

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

    package assign1a;
    

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

    祝你好运。 - 戴夫

    【讨论】:

    • 啊,在我输入答案的时候 :) 这确实是错误的package 声明。是时候修复和重新编译了。
    • 非常感谢,我终于设法让我的 servlet 运行:D
    【解决方案2】:

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

    首先查看您的tomcat 安装文件夹,位于名为webapps 的文件夹下。在那里,找到一个名为 [context] 的文件夹,如 your url http://localhost:8080/[context]/rpc。你看?该文件夹必须命名为您正在使用的 url。 (提供准确的帮助会更容易,如果你提供了准确的信息,不知道你正在使用的 url 就很困难。) 在这个文件夹中,找到文件夹 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、部署方案、访问 url、web.xml)

    【讨论】:

    • 非常感谢您的回复:)
    【解决方案3】:
    java.lang.NoClassDefFoundError: assign1a/RPCServlet (wrong name: server/RPCServlet)
    

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

    发布您的 web.xml 并显示您的 &lt;servlet&gt;&lt;servlet-mapping&gt; 条目。

    【讨论】:

    • 感谢您的快速回复,是的,RPCServlet.class 在 /WEB-INF/classes/assign1a 中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 2014-06-27
    • 2022-12-22
    • 2014-06-15
    • 2019-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多