Jsp servlet异常

时间:2012-09-14 11:46:05

标签: java jsp maven servlets hadoop

我也许看到了这个问题的类似答案,但我觉得我的情况有所不同。我正在开发一个目前为止工作得很好的Spring MVC应用程序,就是我在我的项目中包含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>

一旦我将它添加到我的应用程序中,它就不再可用了,如果没有这些依赖性,事情就会非常顺利。我在这里缺少什么?

2 个答案:

答案 0 :(得分:5)

我认为你的问题是hadoop包含了一个版本的servlet API,它正在&#34;正确的#34;类路径中的servlet API。 Hadoop依赖于Jetty,而jetty将依次尝试包含servlet API。

我有一个项目具有非常相似的设置,Spring MVC和Hadoop。我有以下关于hadoop依赖的排除。请注意,这可能会略有不同,具体取决于您的hadoop分布,我使用的是cloudera&#39; s。由于您使用的servlet容器通常附带自己的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 -->

答案 1 :(得分:1)

我最近在我的网络应用程序中遇到过与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>

我不完全清楚这些中的每一个是否已被排除,但我想确保没有不必要的依赖项进入 - 我正在使用Tomcat,它提供了JSP和servlet库。 jetty-servlet肯定不得不去。