maven依赖冲突导致tomcat启动失败
前两天上线一个服务,在运行tomcat的时候,发现tomcat没有能启动程序,重试一遍还是不行,于是追了一下Catalina的日志文件,发现在tomcat运行中,报了一个错误,
Caused by: java.lang.IllegalStateException: Unable to complete the scan for annotations for web application [/glory-admin] due to a StackOverflowError.
Possible root causes include a too low setting for -Xss and illegal cyclic inheritance dependencies. The class hierarchy being processed was [org.bouncycastle.asn1.ASN1EncodableVector->org.bouncycastle.asn1.DEREncodableVector->org.bouncycastle.asn1.ASN1EncodableVector]
查询发现,是因为在这个项目中,引用了两个相同但版本不同的包,由此导致依赖出错,产生了一个生命周期异常的错误:
ASN1EncodableVector这个类,出现在bcprov*.jar这个包中,解决此问题,有两种办法:
1、第一种,在tomcat的配置文件中配置tomcat启动的时候不扫描这个jar。tomcat/conf/catalina.properties文件,添加tomcat.util.scan.DefaultJarScanner.jarsToSkip=bcprov*.jar,添加完成之后,重新启动tomcat,项目成功启动。
2、第二种,点开target 中的项目中的WEB-INF\lib包,找到引用相同的这两个jar包,然后查找一下低版本的jar包是那个依赖引入的,查询依赖引入的办法:cmd 进入项目中,执行mvn install,再执行mvn dependency:tree > D:\maven.txt,找到依赖后,在相应的依赖中,排除此jar即可。
以bcprov*.jar为例,如果查找到该jar包的低版本为alipay.sdk引用,在alipay.sdk的引用中加入如下代码即可
// alipay.sdk 依赖引用
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.13.0.ALL</version>
//在此依赖中排除掉有冲突的bcprov jar包
<exclusions>
<exclusion>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
</exclusion>
</exclusions>
</dependency>
我的项目中,是使用的第一种方法解决的,如果大家还有别的方法,欢迎交流!