对于这个问题,我也许见过一些类似的答案,但我觉得我的情况有所不同。到目前为止,我正在开发一个spring mvc应用程序,它运行得非常好,也就是说,我在项目中包含了hadoop api,当我包含hadoop时,当我试图打开以前工作过的初始 Jmeter 板页面时,这个异常开始发生:
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条答案
按热度按时间icnyk63a1#
我认为您的问题是hadoop在类路径中包含了一个版本的servlet api,它位于“正确”的servlet api之前。hadoop依赖于jetty,而jetty将反过来尝试包含servlet api。
我有一个设置非常类似的项目,springmvc和hadoop。对于hadoop依赖,我有以下排除项。请注意,这可能会略有不同,这取决于您的hadoop发行版,我使用的是cloudera的。由于您正在使用的servlet容器通常会附带它自己的javax.servlet依赖项,因此您的排除需要捕获这种情况。我只使用jetty测试了以下配置:
w8biq8rn2#
我最近在我的web应用程序中使用hadoopcore1.2.1也有类似的经历。在paul sanwald指出的依赖项之上,我排除了一些org.eclipse.jetty依赖项:
我并不完全清楚是否必须排除其中的每一个,但我想确保没有不必要的依赖关系进入——我使用的是tomcat,它提供了jsp和servlet库。杰蒂肯定得走了。