Не удается запустить сервлет с сервера 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>
записи.