6

サーブレットを実行しようとしています。2日間検索して、考えられるすべての解決策を試しましたが、運がありませんでした。サーブクラスは適切なフォルダー(つまり、パッケージ名の下)にあります。また、サーブレットに必要なjarファイルをlibフォルダーに追加しました。web.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);
                }
        }

}

私を助けてください:)ありがとう。

編集:これが私の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.javaしましたassign1aか?

または、元のパッケージが次のように定義されている可能性があります。

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: 使用しているシステム、開発方法、デプロイ方法に応じて、いくつかの可能性があります。

webapps という名前のフォルダーの下にある、Tomcat のインストール フォルダーの下を調べることから始めます。そこで、 URL http://localhost:8080/ [context] /rpcのように [context] という名前のフォルダーを見つけます。分かりますか?フォルダーには、使用している URL と同じ名前を付ける必要があります。(正確な情報を提供した場合は、正確なヘルプを提供する方が簡単ですが、使用している URL を知らずに困難です。)このフォルダーで、フォルダー WEB-INF を見つけます。そこに、classes という名前のフォルダーが見つかるはずです。 . このフォルダーの下に、assign1a という名前のフォルダーが必要です。その中に、コンパイル済みファイルである RPCServlet.class ファイルが必要です。

したがって、要約すると、[tomcat_install_folder]/webapps/[context]/WEB-INF/classes/assign1a/RPCServlet.class がありません。ああ、スラッシュはもちろんウィンドウのバックスラッシュです:)

動的Webプロジェクトを使用したEclipse

また、Eclipse で開発していて、Eclipse 内で Tomcat サーバーを使用している場合、Tomcat フォルダーは実際にはまったく別の場所にあります。次に、Eclipse ワークスペースの下のフォルダー .metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/[context] で、Tomcat サーバーの数に応じて、tmp0 が tmp1 またはその他の何かになります。 Eclipse ワークスペースで起動しました。

それでもわからない場合は、セットアップに関する詳細情報を投稿してください(つまり、開発アイデア、展開シナリオ、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 という名前のファイルが含まれていますか? そうでない場合は、サーブレットをコンパイルする必要があります。

web.xml を投稿して<servlet><servlet-mapping>エントリを表示します。

于 2011-01-07T01:02:42.657 に答える