Не удается запустить сервлет с сервера tomcat, даже если классы находятся в пакете

Я пытаюсь запустить сервлет, я искал 2 дня и пробовал все возможные решения и не повезло. Класс servet находится в соответствующей папке (i.e под названием пакета). Я также добавил файлы jar, необходимые в моем сервлете, в папку lib. сеть.xml-файл отображает url-адрес и определяет сервлет. Поэтому я сделал все в документации, и люди 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.

и вот мой код сервлета :

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);
                }
        }

}

пожалуйста, помогите мне :) Спасибо.

EDIT: вот содержимое моего веб-сайта.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 ответов


я заметил фразу(wrong name: server/RPCServlet) в сообщении об ошибке.

это обычно означает, что файл класса имеет другое имя пакета, чем структура каталогов в jar/war.

может быть, вы изначально поставить RPCServlet.java под реж.server и потом, позже переехал RPCServlet.java до assign1a?

или, может быть, исходный пакет, определенный как:

package server;

и затем вы изменили его позже на

package assign1a;

в любом случае, чтобы решить, Я предлагаю вам удалить все скомпилированные файлы (файлы классов, файлы войны и т. д.). Остановите tomcat, затем удалите <TOMCAT_HOME>/work каталог, чтобы убедиться, что все пропало.

затем проверьте, чтобы убедиться, что RPCServlet.Java находится в папке с именем assign1a и убедитесь, что пакет определяется как:

package assign1a;

перекомпилировать / перестроить войну, и вы должны быть в лучшем состоянии. Возможно, попробуйте построить войну в Eclipse (или Netbeans), потому что таким образом она не позволит вам скомпилировать папка, которая не соответствует имени пакета Class files.

Удачи. - Дэйв!--11-->


ваша ошибка "noclassdeffound" означает, что tomcat не может найти assign1a.RPCServlet, когда это необходимо. чтобы tomcat мог найти соответствующий класс, он должен быть на пути к классу tomcat. лучший способ поместить его туда - убедиться, что он находится в папке classes. однако найти эту папку может быть немного сложно D: есть несколько возможностей, в зависимости от того, в какой системе вы находитесь, как вы разрабатываете и как вы развертываете.

начните с поиска под вашим tomcat папка установки, в папке с именем webapps. там найдите папку с именем [context], как в Ваш url http://localhost:8080/[контекст] / rpc. вы видите? папка должна быть названа url-адресом, который вы используете. (было бы проще дать точную помощь, если бы вы предоставили точную информацию, это трудно, не зная url, который вы используете.) в этой папке найдите папку WEB-INF, и там вы должны найти папку с именем classes. под в этой папке должна быть папка с именем assign1a, и в ней должен быть файл RPCServlet.class, который является скомпилированным файлом.

Так, в короткое аннотация: [tomcat_install_folder]/веб-приложений/[контексте]/веб-инф/классы/assign1a/RPCServlet.класс отсутствует. Ох, и Слэш, конечно, обратный слеш на Windows :)

eclipse с динамическим веб-проектом

кроме того, если вы разрабатываете eclipse и используете сервер tomcat внутри eclipse, то ваша папка tomcat на самом деле находится в совершенно другом месте. затем вы найдете его в рабочей области eclipse, в папке .метаданные./Плагины/орг.затмение.wst.сервер.core/tmp0/wtpwebapps / [context], где tmp0 может быть tmp1 или что-то еще, в зависимости от того, сколько серверов tomcat вы запустили в рабочей области eclipse.

Если вы все еще не можете понять это, пожалуйста, напишите подробнее о вашей установки (т. е. разработка ide, сценарий развертывания, посещение url, сеть.в XML)


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

вы видите папку с именем / assign1a под /WEB-INF / classes в вашей войне? И содержит ли он файл с именем RPCServlet.класс? Если нет, вам нужно скомпилировать сервлет.

разместить свой веб.XML и показать свой <servlet> и <servlet-mapping> записи.