引入HBase依赖包带来的麻烦

在一个项目里用到HBase做底层存储,使用maven来管理相关Jar包依赖,用maven来管理依赖包,特别不爽的就是他会将你引入Jar包自己的依赖都搞进来,经常会出现一些类和方法冲突找不到等状况。这次,也被这个搞了一阵子。我依赖了HBase jar之后,tomcat启动后,访问Web页面(使用JSP)的时候,页面直接抛出一堆异常,贴一下关键的:

java.lang.AbstractMethodError: javax.servlet.jsp.JspFactory.getJspApplicationContext  (Ljavax/servlet/ServletContext;)Ljavax/servlet/jsp/JspApplicationContext;      org.apache.jsp.index_jsp._jspInit(index_jsp.java:22)      org.apache.jasper.runtime.HttpJspBase.init(HttpJspBase.java:80)      org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:149)      org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:311)      org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:315)      org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)      javax.servlet.http.HttpServlet.service(HttpServlet.java:723)      org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:238)      org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:264)      org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1208)      org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:992)      org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:939)      org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)      org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:915)      org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:811)      javax.servlet.http.HttpServlet.service(HttpServlet.java:617)      org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:796)      javax.servlet.http.HttpServlet.service(HttpServlet.java:723)      org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)      org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
分析得出就是因为引入了apace的jasper导致的,HBase依赖的tomcat:jasper-compiler和tomcat:jasper-runtime搞得我web页面的JSP访问失败。很自然而然地就得将这个jar从hbase依赖POM里面exclude掉。然后重新打包发布即可。

总结一下:一般遇到这种问题解决思路:

1)通过异常找到关键字,确定冲突的类或者方法

2)使用mvn dependency:tree检查是从哪个依赖的POM里面搞进来的冲突

3)修改项目中POM文件中的依赖,将冲突的exclude掉

4)重新打包部署