记录一次解决jar包冲突asposewobfuscated.zz2S->asposewobfuscated.zz2R->asposewobfuscated.zz2S

目录:
1、结论
2、原因
3、解决方案
4、过程
5、发泄

1、先说结论:

引入了两个版本的:aspose-words,导致启动tomcat时候因循环依赖报了StackOverflowError

2、再说原因:

由于改动了pom,导致有些jar包的版本有变动,从而导致tomcat启动失败

aspose-words-16.4.0-jdk16.jar
aspose-words-18.6.jar

3、接着说解决方案:

IDEA安装插件:Maven Helper,用来分析是哪个包间接依赖了aspose-words
截图如下,发现了有3个pom都依赖了aspose-words,共两个版本:16.4.0和18.6

去掉18.6这个版本的依赖,再次启动程序,没有报错了。

4、最后说过程:

报错核心内容:

 org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/xxx]]
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)
	at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:754)
	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:730)
	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734)
	at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:985)
	at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1857)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.IllegalStateException: Unable to complete the scan for annotations for web application [/xxx] 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 [asposewobfuscated.zz2S->asposewobfuscated.zz2R->asposewobfuscated.zz2S]
	at org.apache.catalina.startup.ContextConfig.checkHandlesTypes(ContextConfig.java:2100)
	at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:2044)
	at org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:1990)
	at org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:1960)
	at org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:1913)
	at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1153)
	at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:765)
	at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:299)
	at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:94)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5154)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
	... 10 more

翻译一下:

原因:java.lang.IllegalStateException:
由于StackOverflowError,无法完成web应用程序[/xxx]的注释扫描。
可能的根本原因包括-Xs的设置过低以及非法的循环继承依赖关系。
正在处理的类层次结构为[asposewobfuscated.zz2S->asposewobfusated.zz2R->asposewobfuscated.zz2S]

错误描述中说的“无法完成web应用程序[/xxx]的注释扫描”,可能的原因包括“-Xss”设置过低,脑袋快速检索,-Xss是jvm设置stack的大小的,这个值过小,很容易造成线程的堆栈溢出。
再快速检索下,哪些场景容易导致线程堆栈溢出呢?没有结束条件的递归调用。对,就是这个原因!错误描述中还说了可以考虑类的循环继承依赖关系。
于是接下来的思路就重点找到为什么会有循环依赖,什么是累的循环继承依赖关系?
举个例子,就是A 继承自B,而B又继承自A。A与B就形成了相互继承相互依赖关系。
我能想象到应该就是同一个包的不同版本中,某个类在新版本中的父类被改了,但我很难想象是什么样的程序员,会将父类改为其子类。
带着还有疑问的方向,我找到了部署后的lib依赖的目录,将所有的包在Linux文件系统中用ls保存成文本,并按照字典序排序。然后将代码切换到上一个版本,再次打包到Linux机器上,用ls将上一个版本的lib下的包保存到第二个文本文件中,然后用IDEA的可视化对比工具,发现了里面有很多不同,大多数能判断就是因为我这次的改动引起的,但还有几个我并不知道为什么会产下变动,也就是说不是我主管上希望它改动的。找了个跟“asposewobfuscated”这个单词相近的。最终找到aspose-word,如下图所示:
在这里插入图片描述

5、最后的最后,发泄一下情绪(总结)

aspose-words 因为怕别人看到了他们的代码,所以他们对代码做了扰码处理,就是将人可看懂的类名称,改为人不方便看的名称,给每个类重命名为编号,比如:

public final class zz0A extends zz13 implements zz0X {
    
    
...
}

而每个版本的编号是根据自己版本的类重新编的,所以不同版本的类的继承关系就被打乱了,一旦有多个版本的jar包共存于同一个tomcat,则tomcat在验证这些类的时候就发现关系全是乱的:
ContextConfig.checkHandlesTypes
于是Tomcat就罢工了。

我看我的工程中还有另外一个jar包也是两个版本工程,

netty-3.2.5.Final.jar
netty-3.7.0.Final.jar

但netty没有发生类的循环继承依赖关系,所以没有爆发启动失败这个问题。

猜你喜欢

转载自blog.csdn.net/booynal/article/details/129121839
zz