肿瘤康复网,内容丰富有趣,生活中的好帮手!
肿瘤康复网 > 记录一次解决jar包冲突asposewobfuscated.zz2S->asposewobfuscated.zz2R->asposewobfuscated.zz2S

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

时间:2018-07-07 04:21:20

相关推荐

目录:

1、结论

2、原因

3、解决方案

4、过程

5、发泄

1、先说结论:

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

2、再说原因:

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

aspose-words-16.4.0-jdk16.jaraspose-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.jarnetty-3.7.0.Final.jar

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

如果觉得《记录一次解决jar包冲突asposewobfuscated.zz2S->asposewobfuscated.zz2R->asposewobfuscated.zz2S》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。