我可能已经对此问题找到了类似的答案,但我觉得我的情况有所不同。到目前为止,我正在开发一个运行良好的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>
一旦将其添加到我的应用程序中,它将不再可用,并且自然而然地没有这些依赖关系,一切就可以顺利进行。我在这里想念什么?
我认为您的问题是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 -->