引入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)重新打包部署