摘要:最近某工程啟動(dòng)中拋出了一個(gè)詭異的問題堆棧比較長(zhǎng)主要原因是經(jīng)發(fā)現(xiàn)是由于這個(gè)包中的眾多類在多個(gè)包中均有實(shí)現(xiàn)比如和都有實(shí)現(xiàn)如果該進(jìn)程加載時(shí)使用了中的又加載了中的同時(shí)和的簽名不一致這樣會(huì)導(dǎo)致以上報(bào)錯(cuò)在中查找類發(fā)現(xiàn)在多個(gè)帶或者名字的包中均有實(shí)現(xiàn)可以通
最近某Java工程啟動(dòng)中拋出了一個(gè)詭異的問題, 堆棧比較長(zhǎng), 主要原因是:
java.lang.SecurityException: class "javax.servlet.AsyncListener""s signer information does not match signer information of other classes in the same package
經(jīng)Google, 發(fā)現(xiàn)是由于javax.servlet這個(gè)包中的眾多類, 在多個(gè)Jar包中均有實(shí)現(xiàn)(比如X和Y都有實(shí)現(xiàn)), 如果該Java進(jìn)程加載時(shí), 使用了X.jar中的javax.servlet.A, 又加載了Y.jar中的javax.servlet.B, 同時(shí)X.jar和Y.jar的簽名不一致, 這樣會(huì)導(dǎo)致以上報(bào)錯(cuò).
在IDE中查找類javax.servlet.AsyncListener, 發(fā)現(xiàn)在多個(gè)帶javaee或者servlet名字的jar包中均有實(shí)現(xiàn), 可以通過以下命令獲取工程的所有依賴:
mvn dependency:tree
為了定位是哪個(gè)Jar包導(dǎo)致的該問題, 我們?cè)趯?shí)現(xiàn)了這個(gè)類的Jar包中, 進(jìn)行簽名檢查:
jarsigner -verify xxx.jar
通過這個(gè)命令可以看到該Jar是否有簽名.
最后發(fā)現(xiàn), 這些Jar包中, 只有一個(gè)有簽名, 而其他都沒有:
org.eclipse.jetty.orbit:javax.servlet:jar:3.0.0.v201112011016:compile
所以可以推斷應(yīng)該是這個(gè)eclipse對(duì)servlet的實(shí)現(xiàn)的Jar包使用了簽名, 導(dǎo)致和其他相關(guān)Jar包不兼容. (是有多喜歡造輪子)
而這個(gè)Jar包, 通過依賴樹, 我們發(fā)現(xiàn)是hive-jdbc 2.3.2依賴引入的(看著hive依賴真混亂..., 記得hbase也是), 通過升級(jí)到 3.1.0, 再次檢查依賴, 我們發(fā)現(xiàn)這個(gè)Jar包已經(jīng)不在依賴樹中了. 而啟動(dòng)錯(cuò)誤也消失了.
或者還有另外一個(gè)方法, 把這個(gè)有問題的包從hive-jdbc 2.3.2 中exlucde掉, 讓hive使用其他包中的javax.servlet實(shí)現(xiàn). 其實(shí)即便沒有其他包有javax.servlet的實(shí)現(xiàn), 或者其scope為provided, 只要這個(gè)工程在tomcat中啟動(dòng), 都是可以的. 因?yàn)閠omcat自帶servlet-api實(shí)現(xiàn).
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/71969.html
摘要:異常處理機(jī)制異常與異常類的繼承體系在程序中,當(dāng)程序出現(xiàn)意外情況時(shí),系統(tǒng)會(huì)自動(dòng)生成一個(gè)來通知程序,從異常發(fā)生出逐漸向外傳播,如果沒有人來處理該異常,就會(huì)交給來處理,對(duì)異常的處理方法是,打印異常跟蹤棧信息,并中止程序的執(zhí)行。 1 為什么要處理異常? 異常機(jī)制可以使程序的異常處理代碼與正常業(yè)務(wù)代碼分離,保證程序代碼的健壯性。在設(shè)計(jì)程序的時(shí)候,好的程序需要盡可能處理已知的可能產(chǎn)生的錯(cuò)誤,但是事...
摘要:花了將近兩個(gè)星期完成了功能,期間我編寫的能力也算是有所提升了。所以能看到這篇文章的同學(xué)都是大佬如果想看更多的原創(chuàng)技術(shù)文章,歡迎大家關(guān)注我的微信公眾號(hào)??赡芨信d趣的鏈接文章的目錄導(dǎo)航微信公眾號(hào)端文章的目錄導(dǎo)航端海量精美腦圖 前言 只有光頭才能變強(qiáng) 2018年8月30日,今天我辭職了。在6月25號(hào)入職,到現(xiàn)在也有兩個(gè)月時(shí)間了。 感受: 第一天是期待的:第一次將項(xiàng)目拉到本地上看的時(shí)候,代碼...
摘要:例子二以下開始用異常處理機(jī)制捕獲該異常在這里,這個(gè)其實(shí)就是這里用到了程序運(yùn)行時(shí)的多態(tài)思想。語句就像一個(gè)調(diào)用函數(shù),當(dāng)程序運(yùn)行中拋出了一個(gè)異常對(duì)象,就會(huì)調(diào)用對(duì)應(yīng)的來處理。 傳統(tǒng)的語言如何處理 在一些傳統(tǒng)的語言(如C語言中) if語句來判斷是否出現(xiàn)了例外 全程變量ErrNo 但這有幾個(gè)缺點(diǎn) 正常處理與異常處理的代碼同樣處理 可讀性(readability)差 每次調(diào)用一個(gè)方法時(shí)都進(jìn)行錯(cuò)...
摘要:可以被異常處理機(jī)制使用,是異常處理的核心。非檢測(cè)異常,在編譯時(shí),不會(huì)提示和發(fā)現(xiàn)異常的存在,不強(qiáng)制要求程序員處理這樣的異常??傮w來說,語言的異常處理流程,從程序中獲取異常信息。處理運(yùn)行時(shí)異常,采用邏輯合理規(guī)避同時(shí)輔助處理。 目錄 什么是Java異常? 當(dāng)一個(gè)Exception在程序中發(fā)生的時(shí)候,JVM是怎么做的呢? 當(dāng)我們編寫程序的時(shí)候如何對(duì)待可能出現(xiàn)的異常呢? 正文 1. 什么是J...
摘要:異常處理的個(gè)最佳實(shí)踐原文地址翻譯出處在中,異常處理是個(gè)很麻煩的事情。使用描述性消息拋出異常這個(gè)最佳實(shí)踐背后的想法與前兩個(gè)類似。當(dāng)你以錯(cuò)誤的格式提供時(shí),它將被類的構(gòu)造函數(shù)拋出。類提供了特殊的構(gòu)造函數(shù)方法,它接受一個(gè)作為參數(shù)。 Java 異常處理的 9 個(gè)最佳實(shí)踐 原文地址:https://dzone.com/articles/9-...翻譯出處:https://www.oschina.n...
閱讀 1540·2021-11-24 09:39
閱讀 1845·2021-11-22 15:25
閱讀 3815·2021-11-19 09:40
閱讀 3358·2021-09-22 15:31
閱讀 1372·2021-07-29 13:49
閱讀 1307·2019-08-26 11:59
閱讀 1381·2019-08-26 11:39
閱讀 986·2019-08-26 11:00