摘要:最近某工程啟動中拋出了一個詭異的問題堆棧比較長主要原因是經發現是由于這個包中的眾多類在多個包中均有實現比如和都有實現如果該進程加載時使用了中的又加載了中的同時和的簽名不一致這樣會導致以上報錯在中查找類發現在多個帶或者名字的包中均有實現可以通
最近某Java工程啟動中拋出了一個詭異的問題, 堆棧比較長, 主要原因是:
java.lang.SecurityException: class "javax.servlet.AsyncListener""s signer information does not match signer information of other classes in the same package
經Google, 發現是由于javax.servlet這個包中的眾多類, 在多個Jar包中均有實現(比如X和Y都有實現), 如果該Java進程加載時, 使用了X.jar中的javax.servlet.A, 又加載了Y.jar中的javax.servlet.B, 同時X.jar和Y.jar的簽名不一致, 這樣會導致以上報錯.
在IDE中查找類javax.servlet.AsyncListener, 發現在多個帶javaee或者servlet名字的jar包中均有實現, 可以通過以下命令獲取工程的所有依賴:
mvn dependency:tree
為了定位是哪個Jar包導致的該問題, 我們在實現了這個類的Jar包中, 進行簽名檢查:
jarsigner -verify xxx.jar
通過這個命令可以看到該Jar是否有簽名.
最后發現, 這些Jar包中, 只有一個有簽名, 而其他都沒有:
org.eclipse.jetty.orbit:javax.servlet:jar:3.0.0.v201112011016:compile
所以可以推斷應該是這個eclipse對servlet的實現的Jar包使用了簽名, 導致和其他相關Jar包不兼容. (是有多喜歡造輪子)
而這個Jar包, 通過依賴樹, 我們發現是hive-jdbc 2.3.2依賴引入的(看著hive依賴真混亂..., 記得hbase也是), 通過升級到 3.1.0, 再次檢查依賴, 我們發現這個Jar包已經不在依賴樹中了. 而啟動錯誤也消失了.
或者還有另外一個方法, 把這個有問題的包從hive-jdbc 2.3.2 中exlucde掉, 讓hive使用其他包中的javax.servlet實現. 其實即便沒有其他包有javax.servlet的實現, 或者其scope為provided, 只要這個工程在tomcat中啟動, 都是可以的. 因為tomcat自帶servlet-api實現.
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71969.html
摘要:花了將近兩個星期完成了功能,期間我編寫的能力也算是有所提升了。所以能看到這篇文章的同學都是大佬如果想看更多的原創技術文章,歡迎大家關注我的微信公眾號。可能感興趣的鏈接文章的目錄導航微信公眾號端文章的目錄導航端海量精美腦圖 前言 只有光頭才能變強 2018年8月30日,今天我辭職了。在6月25號入職,到現在也有兩個月時間了。 感受: 第一天是期待的:第一次將項目拉到本地上看的時候,代碼...
摘要:異常處理的個最佳實踐原文地址翻譯出處在中,異常處理是個很麻煩的事情。使用描述性消息拋出異常這個最佳實踐背后的想法與前兩個類似。當你以錯誤的格式提供時,它將被類的構造函數拋出。類提供了特殊的構造函數方法,它接受一個作為參數。 Java 異常處理的 9 個最佳實踐 原文地址:https://dzone.com/articles/9-...翻譯出處:https://www.oschina.n...
閱讀 1458·2021-11-24 09:39
閱讀 1775·2021-11-22 15:25
閱讀 3728·2021-11-19 09:40
閱讀 3283·2021-09-22 15:31
閱讀 1288·2021-07-29 13:49
閱讀 1192·2019-08-26 11:59
閱讀 1308·2019-08-26 11:39
閱讀 919·2019-08-26 11:00