在tomcat上部署战争时无限循环7 [英] Infinite loop when deploying a war on tomcat 7

查看:200
本文介绍了在tomcat上部署战争时无限循环7的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图在Tomcat 7.0.29中部署一场战争。我有以下日志堆栈:

  GRAVE:等待多线程部署上下文描述符以完成$ b $ java.util.concurrent.ExecutionException:java.lang.StackOverflowError 
在java.util.concurrent.FutureTask $ Sync.innerGet(FutureTask.java:222)
在java.util.concurrent.FutureTask。 get(FutureTask.java:83)
在org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:574)
在org.apache.catalina.startup.HostConfig.deployApps(HostConfig。 java:470)
在org.apache.catalina.startup.HostConfig.start(HostConfig.java:1413)
在org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:313)
在org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
在org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
在org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:401)
在org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:346)
在org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1140)
在org.apache .catalina.core.StandardHost.startInternal(StandardHost.java:785)
在org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
在org.apache.catalina.core .ContainerBase $ StartChild.call(ContainerBase.java:1559)
在org.apache.catalina.core.ContainerBase $ StartChild.call(ContainerBase.java:1549)
在java.util.concurrent.FutureTask $ Sync.innerRun(FutureTask.java:303)
在java.util.concurrent.FutureTask.run(FutureTask.java:138)
在java.util.concurrent.ThreadPoolExecutor $ Worker.runTask(ThreadPoolExecutor .java:886)
在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:908)
在java.lang.Thread.run(Thread.java:662)
引起的:java.lang.StackOverflowError
在java.util.HashSet。< init>(哈希Set.java:86)
在org.apache.catalina.startup.ContextConfig.populateSCIsForCacheEntry(ContextConfig.java:2208)
在org.apache.catalina.startup.ContextConfig.populateSCIsForCacheEntry(ContextConfig.java: 2227)
在org.apache.catalina.startup.ContextConfig.populateSCIsForCacheEntry(ContextConfig.java:2227)
在org.apache.catalina.startup.ContextConfig.populateSCIsForCacheEntry(ContextConfig.java:2227)
在org.apache.catalina.startup.ContextConfig.populateSCIsForCacheEntry(ContextConfig.java:2227)
在org.apache.catalina.startup.ContextConfig.populateSCIsForCacheEntry(ContextConfig.java:2227)
在org .apache.catalina.startup.ContextConfig.populateSCIsForCacheEntry(ContextConfig.java:2227)
在org.apache.catalina.startup.ContextConfig.populateSCIsForCacheEntry(ContextConfig.java:2227)

(许多堆栈框架ommited ...)



有人面临同样的问题吗?

解决方案

这是上报的问题#53871 在Tomcat问题似乎是通过注释扫描,Tomcat 7.0.38包含更清晰的错误消息。



从错误报告中:


由于依赖关系管理问题,我部署了一个包含两个包含不同版本库的JAR文件的WAR文件,其中版本1包含继承自B的另一个版本2,一个继承自A.
的类B以这样的顺序加载这些类,即A和B相互循环地继承,导致在populateSCIsForCacheEntry中的堆栈溢出,因为它不会在继承树中检测周期。


这正是我的情况下的问题:旧版本的 dom4j 捆绑不兼容 jaxen 的版本。 7.0.38中的新错误诊断显示了哪些类形成了一个循环,我通过升级这些依赖来修复它。


I try to deploy a war into Tomcat 7.0.29. I'm having the following log stack :

GRAVE: Error waiting for multi-thread deployment of context descriptors to complete
java.util.concurrent.ExecutionException: java.lang.StackOverflowError
    at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:222)
    at java.util.concurrent.FutureTask.get(FutureTask.java:83)
    at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:574)
    at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:470)
    at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1413)
    at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:313)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
    at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:401)
    at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:346)
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1140)
    at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:785)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.StackOverflowError
    at java.util.HashSet.<init>(HashSet.java:86)
    at org.apache.catalina.startup.ContextConfig.populateSCIsForCacheEntry(ContextConfig.java:2208)
    at org.apache.catalina.startup.ContextConfig.populateSCIsForCacheEntry(ContextConfig.java:2227)
    at org.apache.catalina.startup.ContextConfig.populateSCIsForCacheEntry(ContextConfig.java:2227)
    at org.apache.catalina.startup.ContextConfig.populateSCIsForCacheEntry(ContextConfig.java:2227)
    at org.apache.catalina.startup.ContextConfig.populateSCIsForCacheEntry(ContextConfig.java:2227)
    at org.apache.catalina.startup.ContextConfig.populateSCIsForCacheEntry(ContextConfig.java:2227)
    at org.apache.catalina.startup.ContextConfig.populateSCIsForCacheEntry(ContextConfig.java:2227)
    at org.apache.catalina.startup.ContextConfig.populateSCIsForCacheEntry(ContextConfig.java:2227)

(Many stack frames ommited...)

Does anybody face the same problem ?

解决方案

This is reported upstream as issue #53871 in Tomcat. The problem appears to be with annotation scanning, and Tomcat 7.0.38 includes a clearer error message.

From the bug report:

Due to dependency management problems I deployed a WAR file containing two JAR files containing different versions of a library, where version 1 contained a class A which inherited from B and another version 2 which contained a class B inheriting from A. The classes were loaded in such an order that A and B cyclically inherited from each other which leads to a stack overflow in populateSCIsForCacheEntry because it does not detect cycles in the inheritance tree.

This was exactly the problem in my case: an old version of dom4j bundled an incompatible version of jaxen. The new error diagnostic in 7.0.38 showed exactly which classes formed a loop and I fixed it by upgrading those dependencies.

这篇关于在tomcat上部署战争时无限循环7的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆