Не могу запустить мой сервлет с сервера Tomcat, хотя классы находятся в пакете - PullRequest
6 голосов
/ 07 января 2011

Я пытаюсь запустить свой сервлет, я искал 2 дня и пробовал все возможные решения, но безуспешно.Класс servet находится в соответствующей папке (то есть под именем пакета).Я также добавил файлы jar, необходимые для моего сервлета, в папку lib.файл web.xml отображает URL и определяет сервлет.Итак, я сделал все в документации, и многие люди сказали здесь и все еще получают эту ошибку:

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

}

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

РЕДАКТИРОВАТЬ: вот содержимое моего файла 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 ]

4 голосов
/ 07 января 2011

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

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

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

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

package server;

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

package assign1a;

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

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

package assign1a;

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

Удачи.- Дэйв

2 голосов
/ 07 января 2011

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

Начните с поиска в папке установки tomcat, в папке с именем webapps. там найдите папку с именем [context], как в ваш 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 отсутствует. о, и прямые косые черты, конечно, обратные косые черты на окнах:)

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

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

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

0 голосов
/ 07 января 2011
java.lang.NoClassDefFoundError: assign1a/RPCServlet (wrong name: server/RPCServlet)

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

Разместите свой web.xml и покажите свои записи <servlet> и <servlet-mapping>.

...