2012-09-04 3 views
7

Provo a distribuire una guerra in Tomcat 7.0.29. Sto avendo il seguente registro stack:Ciclo infinito durante la distribuzione di una guerra su tomcat 7

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) 

(Molti stack frame ommited ...)

Qualcuno affrontare lo stesso problema?

+0

puoi pubblicare i contenuti web.xml? – Dan

+2

Vedere https://issues.apache.org/bugzilla/show_bug.cgi?id=53871 –

risposta

2

Sto riscontrando anche questo problema in Tomcat 7.0. e Tomcat 7.0. . Tuttavia con Tomcat 7.0. tutto funziona correttamente, quindi sospetto che sia il problema di Tomcat, che è stato recentemente introdotto.

L'errore riscontrato in 7.0. e 7.0. , quando si avvia Tomcat e la distribuzione di un file 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) 
1

Una soluzione: ho cambiato il nome del WAR (senza NomeFinale in pom.xml e ha cambiato la versione artefatto) e ha funzionato .. .. perché? Non lo so fino ad ora!

Una soluzione reale e genuina? Sicuramente una nuova release Tomcat. . .

1

Per me questo comportamento è stato riprodotto in IntelliJ Idea quando ho impostato il contesto dell'applicazione sullo stesso nome di Maven atrifactId nel file .pom. E.g. my artifactId è 'test', quindi imposto il contesto dell'applicazione (Modifica configurazione -> Tomcat Server -> Distribuzione, seleziona l'artefatto esploso) a '/ test'. Non appena ho cambiato il contesto dell'applicazione, tutto ha funzionato.

4

Questo è segnalato a monte come numero #53871 in Tomcat. Il problema sembra essere dovuto alla scansione delle annotazioni e Tomcat 7.0.38 include un messaggio di errore più chiaro.

Dal bug report:

A causa di problemi di gestione delle dipendenze ho schierato un file WAR che contiene due file JAR contenenti diverse versioni di una biblioteca, dove la versione 1 conteneva una classe A che ha ereditato da B e un'altra versione 2 che conteneva una classe B ereditata da A. Le classi venivano caricate in un ordine tale che A e B si ereditavano ciclicamente l'una dall'altra e porta a un overflow dello stack in populateSCIsForCacheEntry perché non rileva i cicli nell'albero di ereditarietà.

Questo era esattamente il problema nel mio caso: una vecchia versione di dom4j in bundle una versione incompatibile di jaxen. La nuova diagnostica degli errori in 7.0.38 ha mostrato esattamente quali classi formavano un ciclo e l'ho risolto aggiornando tali dipendenze.

1

Utilizzare una versione inferiore di Tomcat. Ci sono problemi con la versione di Tomcat che stai utilizzando.

1

Ho avuto lo stesso problema. Penso che sia stato causato da Tomcat 7, quindi quando sono passato a Tomcat 6.0.35, il problema si è risolto come un incantesimo.