5

私はおそらくこの質問に対するいくつかの同様の答えを見たことがありますが、私の状況は異なっていると感じています。私はこれまでのところうまく機能するSpringMVCアプリを開発しています。つまり、プロジェクトにhadoop apiを含めました。hadoopを含めると、以前に機能した最初のダッシュボードページを開こうとしたときにこの例外が発生し始めました。

java.lang.AbstractMethodError: javax.servlet.jsp.JspFactory.getJspApplicationContext(Ljavax/servlet/ 
ServletContext;)Ljavax/servlet/jsp/JspApplicationContext;
 org.apache.jsp.ServerInfo_jsp._jspInit(ServerInfo_jsp.java:63)
 org.apache.jasper.runtime.HttpJspBase.init(HttpJspBase.java:52)
 org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:158)
 org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:328)
 org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:336)
 org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
 org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:9

これが私のHadoop依存関係がどのように見えるかです:

<dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>0.23.1-mr1-cdh4.0.0b2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-core</artifactId>
            <version>0.23.1-mr1-cdh4.0.0b2</version>
            <exclusions>
                <exclusion>
                    <groupId>org.mortbay.jetty</groupId>
                    <artifactId>jetty</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>javax.servlet</groupId>
                    <artifactId>servlet-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

これをアプリに追加すると、使用できなくなり、当然、これらの依存関係がないと、非常にスムーズに実行されます。ここで何が欠けていますか?

4

2 に答える 2

5

あなたの問題は、クラスパスの「正しい」サーブレット API の前に来るサーブレット API のバージョンが Hadoop に含まれていることだと思います。Hadoop は Jetty に依存しており、jetty はサーブレット API を含めようとします。

Spring MVC と Hadoop という非常によく似た設定のプロジェクトがあります。Hadoop の依存関係については、以下の除外があります。これは Hadoop ディストリビューションによって若干異なる場合があることに注意してください。私は cloudera のものを使用しています。使用しているサーブレット コンテナーは通常、独自の javax.servlet 依存関係と共に出荷されるため、除外ではこのケースをキャッチする必要があります。Jetty を使用して以下の構成のみをテストしました。

           <dependency>     
              <groupId>org.apache.hadoop</groupId>
              <artifactId>hadoop-core</artifactId>
              <version>${hadoop.version}</version>
           <exclusions>

          <exclusion>
                <groupId>org.mortbay.jetty</groupId>
                <artifactId>jetty</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.mortbay.jetty</groupId>
                <artifactId>jetty-util</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.mortbay.jetty</groupId>
                <artifactId>jsp-2.1</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.mortbay.jetty</groupId>
                <artifactId>jsp-api-2.1</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.mortbay.jetty</groupId>
                <artifactId>servlet-api-2.1</artifactId>
            </exclusion>
            <exclusion>
                <groupId>javax.servlet</groupId>
                <artifactId>servlet-api</artifactId>
            </exclusion>
            <exclusion>
                <groupId>javax.servlet.jsp</groupId>
                <artifactId>jsp-api</artifactId>
            </exclusion>
            <exclusion>
                <groupId>tomcat</groupId>
                <artifactId>jasper-compiler</artifactId>
            </exclusion>
            <exclusion>
                <groupId>tomcat</groupId>
                <artifactId>jasper-runtime</artifactId>
            </exclusion>
            <!-- other exclusions snipped for brevity -->
于 2012-09-14T13:42:56.263 に答える
1

私は最近、Web アプリケーションの hadoop-core 1.2.1 で同様の経験をしました。Paul Sanwald が示した依存関係に加えて、いくつかの org.eclipse.jetty 依存関係を除外しました。

            <exclusion>
                <groupId>org.eclipse.jetty</groupId>
                <artifactId>jetty-server</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.eclipse.jetty</groupId>
                <artifactId>jetty-servlet</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.eclipse.jetty</groupId>
                <artifactId>jetty-client</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.eclipse.jetty</groupId>
                <artifactId>jetty-plus</artifactId>
            </exclusion>

これらすべてを除外する必要があるかどうかは完全にはわかりませんが、不要な依存関係が入っていないことを確認したかったので、JSP とサーブレット ライブラリを提供する Tomcat を使用しています。 jetty-servlet は絶対に行かなければなりませんでした。

于 2013-10-16T16:01:36.407 に答える