【问题标题】:Infinite loop when deploying a war on tomcat 7在tomcat 7上部署战争时的无限循环
【发布时间】:2012-08-29 02:59:56
【问题描述】:

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

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)

(省略了许多堆栈帧...)

有人遇到同样的问题吗?

【问题讨论】:

标签: java tomcat deployment war webarchive


【解决方案1】:

这在上游报告为 Tomcat 中的问题 #53871。问题似乎与注释扫描有关,并且 Tomcat 7.0.38 包含更清晰的错误消息。

来自错误报告:

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

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

【讨论】:

    【解决方案2】:

    我在 Tomcat 7.0.29 和 Tomcat 7.0.30 中也遇到了这个问题。但是使用 Tomcat 7.0。28 一切正常,所以我怀疑这是最近引入的 Tomcat 问题。

    7.0.29和7.0.30,启动Tomcat和部署war文件时遇到的错误:

    14:01:06,380 ERROR [HostConfig:576] 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:252)
        at java.util.concurrent.FutureTask.get(FutureTask.java:111)
        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:334)
        at java.util.concurrent.FutureTask.run(FutureTask.java:166)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
        at java.lang.Thread.run(Thread.java:722)
    Caused by: java.lang.StackOverflowError
        at java.util.HashSet.<init>(HashSet.java:103)
        at org.apache.catalina.startup.ContextConfig.populateSCIsForCacheEntry(ContextConfig.java:2243)
        at org.apache.catalina.startup.ContextConfig.populateSCIsForCacheEntry(ContextConfig.java:2260)
        at org.apache.catalina.startup.ContextConfig.populateSCIsForCacheEntry(ContextConfig.java:2260)
    

    【讨论】:

      【解决方案3】:

      对我来说,当我将应用程序上下文设置为与 .pom 文件中的 Maven atrifactId 相同的名称时,这种行为在 IntelliJ Idea 中重现。 例如。我的 artifactId 是“test”,然后我将应用程序上下文(编辑配置 -> Tomcat 服务器 -> 部署,选择分解的工件)设置为“/test”。更改应用程序上下文后,一切正常。

      【讨论】:

        【解决方案4】:

        我遇到了同样的问题。我认为是 Tomcat 7 引起的,所以当我换成 Tomcat 6.0.35 后,问题就解决了。

        【讨论】:

          【解决方案5】:

          使用较低版本的 Tomcat。您使用的 Tomcat 版本存在问题。

          【讨论】:

            【解决方案6】:

            一种解决方法:我更改了 WAR 的名称(pom.xml 中没有 finalName 并更改了工件版本)并且它有效....为什么?到现在还不知道!

            真正的真正解决方案?绝对是一个新的 Tomcat 版本。 . .

            【讨论】:

              猜你喜欢
              • 2020-09-24
              • 1970-01-01
              • 2012-11-27
              • 2019-09-09
              • 1970-01-01
              • 1970-01-01
              • 2011-12-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多