摘要:最近某工程启动中抛出了一个诡异的问题堆栈比较长主要原因是经发现是由于这个包中的众多类在多个包中均有实现比如和都有实现如果该进程加载时使用了中的又加载了中的同时和的签名不一致这样会导致以上报错在中查找类发现在多个带或者名字的包中均有实现可以通
最近某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实现.
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/71969.html
摘要:花了将近两个星期完成了功能,期间我编写的能力也算是有所提升了。所以能看到这篇文章的同学都是大佬如果想看更多的原创技术文章,欢迎大家关注我的微信公众号。可能感兴趣的链接文章的目录导航微信公众号端文章的目录导航端海量精美脑图 前言 只有光头才能变强 2018年8月30日,今天我辞职了。在6月25号入职,到现在也有两个月时间了。 感受: 第一天是期待的:第一次将项目拉到本地上看的时候,代码...
摘要:异常处理的个最佳实践原文地址翻译出处在中,异常处理是个很麻烦的事情。使用描述性消息抛出异常这个最佳实践背后的想法与前两个类似。当你以错误的格式提供时,它将被类的构造函数抛出。类提供了特殊的构造函数方法,它接受一个作为参数。 Java 异常处理的 9 个最佳实践 原文地址:https://dzone.com/articles/9-...翻译出处:https://www.oschina.n...
阅读 1457·2021-11-24 09:39
阅读 1774·2021-11-22 15:25
阅读 3728·2021-11-19 09:40
阅读 3283·2021-09-22 15:31
阅读 1287·2021-07-29 13:49
阅读 1191·2019-08-26 11:59
阅读 1307·2019-08-26 11:39
阅读 918·2019-08-26 11:00