(點選上方公眾號,可快速關註)
來源:等你歸去來,
www.cnblogs.com/yougewe/p/8227447.html
maven是一個很好的專案管理工具,你可以輕鬆的定義一個取用,從而達到使用別人寫好的庫的作用。且maven可以輕鬆地和jenkins配合,從而使打包部署變得更容易。
但是也因為這樣,我們變得更傻瓜了,以致於有時候都忘了一些原始的基礎的方法了,當然這不是本文的目的,本文的目的在於,如何解決一些maven帶來的衝突問題。
問題1: jenkins 打包失敗了,導致我無法安裝程式碼到測試環境,怎麼辦?
答: 一般我們都會基於jenkins做一些二次開發,以適應公司內部的需求,或者最佳化一些修改化的東西。 但是由於jenkins本身還是比較複雜的,有時候難免我們搞不清楚其原理,從而導致一些無法打包的問題。 當然,我這邊遇到的問題一般都是由於jenkins的快取機制導致的問題,所以,在我本地可以打包的程式碼,放到jenkins上就死活打不了包,因為我依賴的一個jar包,由於被jenkins快取了一個老版本的包,裡面沒有我新的東西從而導致打包失敗,看起來短時間內無法解決這個快取問題。
於是,我透過本地ide工具打好war包後,上傳到伺服器的tomcat目錄,等待tomcat自動部署完成後就可以重新啟動新程式碼了,從而繞過了jenkins失敗的問題了。
針對jar包,則更為方便,直接本地生成jar包,然後替換伺服器上的相應包,重啟服務即可。
總之,這裡的解決方案就是,當工具出了問題的時候,我們就不能再依賴工具了,回到原始狀態解決問題。
問題2: 當我們運行了程式碼(war/jar)後,報某個方法未找到,即:java.lang.NoSuchMethodError:, 仔細檢視程式碼,其實是有該方法的,如何排查?
答: 針對該問題,一般情況下都是由於引入了多個相同功能的jar包,且包路徑完全一致,而在類載入器載入時,可能會載入到你不想要載入的類,從而導致沒有該方法。
解決辦法就是,刪除不是自己的取用,從而達到使用自己意圖的類。maven中即表現為排除某個依賴,如:
com.xx.activity
abc
2.0.13-SNAPSHOT
dubbo
com.meidusa.venus
venus-backend
但是,還有個問題,那就是如何才能找到是取用了哪個包,才導致的衝突呢?因為你從原生代碼來看,沒有一點異常。
我們可以直接搜尋整個包的取用,並解開其中的程式碼,檢視是衝突的類(衝突方法比較難找出來),當然是直接在伺服器上進行查找了。
find . -name ‘*.jar’ -exec jar -tvf {} \; | grep EE # 即找出所有的jar包,再解壓出其檔案串列,再搜尋衝突的類名
如果有發現兩個相同的結果,那麼就是衝突了,解決該衝突即可。
當然,如果引入的jar檔案不多,或者你有基本方向懷疑是哪個包衝突了,那麼,直接將該包下載下來,用反編譯工具(如jd-gui)編譯出來,檢視其內部情況,便一目瞭然。
問題3: 發現tomcat啟動異常快,而且很多載入流程都沒有,就直接啟動了,實際上各個應有的服務都不存在,這怎麼排查?
答: 這種問題比較沒有頭緒,解決起來也基本靠運氣。 這裡tomcat看起來正常啟動了,但是實際上很多事情都沒做,沒載入。從另一個角度來說,就是載入中斷了。最麻煩的是日誌中一點資訊都不會給出。一般可以先從程式碼的改動處開始排查,以一段一段的程式碼還原方式為主要排查手段。
其中有一很關鍵的問題就是,你取用了一個jdk版本比你自己的執行環境高的jar包,按照jvm的載入原理,其會先檢查class檔案的版本號,如果高於自己所能載入的版本,那麼,它就直接拒絕載入了,而並不會檢查該class檔案是否取用了一些不認識的特性。如果jvm不載入類了,那麼你後續流程就無法進行了。
如果確實是因為jar包版本導致的問題,那麼,問題就好解決了。 1. 要麼叫給你提供jar包的同學將其打包的jdk版本降到你需要的版本就可以了。 2. 升級自己的jvm執行環境,升級jdk, 當然這個風險可能會有,小心行事。
以上,就是一點點問題排查心得,聊以慰藉。也希望對有類似的問題的同學指明一個方向。
遇到問題的時候我們往往是這樣,一個問題,可能幾天下來也不一定能解決,但是到真正解決了的時候,發現其實很簡單。然後,也許下一次,又繼續!
看完本文有收穫?請轉發分享給更多人
關註「ImportNew」,提升Java技能