【问题标题】:Jsp servlet exceptionJsp servlet 异常
【发布时间】:2012-09-07 13:56:51
【问题描述】:

也许我已经看到了一些类似的答案,但我觉得我的情况有所不同。到目前为止,我正在开发一个运行良好的 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>

一旦我将它添加到我的应用程序中,它就不再可用了,并且自然而然地没有这些依赖关系,事情就会运行得非常顺利。我在这里错过了什么?

【问题讨论】:

    标签: java jsp maven servlets hadoop


    【解决方案1】:

    我认为您的问题是 hadoop 包含一个 servlet API 版本,该版本在类路径中的“正确”servlet API 之前出现。 Hadoop 依赖于 Jetty,Jetty 会反过来尝试包含一个 servlet API。

    我有一个设置非常相似的项目,即 Spring MVC 和 Hadoop。对于 hadoop 依赖项,我有以下排除项。请注意,这可能会根据您的 hadoop 发行版而略有不同,我使用的是 cloudera 的。由于您使用的 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 -->
    

    【讨论】:

      【解决方案2】:

      我最近在我的 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 和 servlet 的 Tomcat图书馆。 jetty-servlet 肯定要走了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-11
        • 2021-09-02
        • 2017-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多