Возможные корневые причины включают слишком низкую настройку для -Xss и незаконных циклических зависимостей наследования

Мое приложение перестает быть большим и использует множество банок и инструментов. Платформа - сервер Windows 2008, Spring, hibernate, Quarts, mysql, tomcat-7.35

Когда я развертываю и запускаю сервер в первый раз, работая отлично, но если я перезапущу, я получаю ниже err

    SEVERE: ContainerBase.addChild: start: 
    org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/TestProject]]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:633)
    at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1114)
    at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1673)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    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.IllegalStateException: Unable to complete the scan for annotations for web application [/TestProject]. Possible root causes include a too low setting for -Xss and illegal cyclic inheritance dependencies
    at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:2109)
    at org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:1981)
    at org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:1947)
    at org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:1932)
    at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1326)
    at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:878)
    at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:369)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5179)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    ... 11 more
    Caused by: java.lang.StackOverflowError
    at java.util.HashSet.<init>(HashSet.java:103)
    at org.apache.catalina.startup.ContextConfig.populateSCIsForCacheEntry(ContextConfig.java:2252)
    at org.apache.catalina.startup.ContextConfig.populateSCIsForCacheEntry(ContextConfig.java:2269)
    at org.apache.catalina.startup.ContextConfig.populateSCIsForCacheEntry(ContextConfig.java:2269)
    at org.apache.catalina.startup.ContextConfig.populateSCIsForCacheEntry(ContextConfig.java:2269)
    at org.apache.catalina.startup.ContextConfig.populateSCIsForCacheEntry(ContextConfig.java:2269)
    at org.apache.catalina.startup.ContextConfig.populateSCIsForCacheEntry(ContextConfig.java:2269)
    at org.apache.catalina.startup.ContextConfig.populateSCIsForCacheEntry(ContextConfig.java:2269)
    at org.apache.catalina.startup.ContextConfig.populateSCIsForCacheEntry(ContextConfig.java:2269)
    at org.apache.catalina.startup.ContextConfig.populateSCIsForCacheEntry(ContextConfig.java:2269)
    at org.apache.catalina.startup.ContextConfig.populateSCIsForCacheEntry(ContextConfig.java:2269)
    at org.apache.catalina.startup.ContextConfig.populateSCIsForCacheEntry(ContextConfig.java:2269)
    at org.apache.catalina.startup.ContextConfig.populateSCIsForCacheEntry(ContextConfig.java:2269)
    at org.apache.catalina.startup.ContextConfig.populateSCIsForCacheEntry(ContextConfig.java:2269)
    at org.apache.catalina.startup.ContextConfig.populateSCIsForCacheEntry(ContextConfig.java:2269)
    at org.apache.catalina.startup.ContextConfig.populateSCIsForCacheEntry(ContextConfig.java:2269)
    at org.apache.catalina.startup.ContextConfig.populateSCIsForCacheEntry(ContextConfig.java:2269)
    at org.apache.catalina.startup.ContextConfig.populateSCIsForCacheEntry(ContextConfig.java:2269)
    at org.apache.catalina.startup.ContextConfig.populateSCIsForCacheEntry(ContextConfig.java:2269)
    at org.apache.catalina.startup.ContextConfig.populateSCIsForCacheEntry(ContextConfig.java:2269)

    Feb 16, 2013 12:16:10 PM org.apache.catalina.startup.HostConfig deployDirectory
    SEVERE: Error deploying web application directory C:\apache-tomcat-7.0.35\webapps\TestProject
    java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[TestProject]]
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:904)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:633)
    at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1114)
    at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1673)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    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)

Ответ 1

мой проект отлично работает в tomcat7.25, но не в 7.35

Ответ 2

Трассировка стека говорит, что tomcat исчерпывает пространство стека в потоке, который сканирует ваше приложение, ища конфигурации сервлета на основе Java. Существует три способа решения этой проблемы.

  • Увеличить размер стека -Xss4m
  • Скажите Tomcat не сканировать ваше приложение, если вы не используете конфигурацию сервлета на основе java, добавьте metadata-complete="true" в свое веб-приложение в web.xml
  • Ограничить то, что сканирование файлов jar files tomcat. см. http://tomcat.apache.org/tomcat-7.0-doc/config/jar-scanner.html

Обновление 1

вам нужно передать -Xss4m в jvm, чтобы установить размер стека, -Xss10m установил бы его в 10mb.

Я использую Hibernate и Spring в моем приложении тоже с аннотациями, сканирование, которое делает tomcat, - это поиск аннотаций сервлета 3.0, чтобы вы все еще могли ограничивать вещи при использовании аннотаций спящего режима и Spring, поскольку спящий режим и Spring аннотации сканируются на Spring и спящий режим.

Если вы используете tomcat в качестве службы Windows, вам понадобится передать аргументы через прокрутку, поскольку это исполняемый файл, запускающий jvm. Документы для прокрутки находятся в http://commons.apache.org/daemon/procrun.html. tomcat7.exe действительно procrun.exe переименован, что означает, что все ваши параметры jvm записываются в регистр под

Основные определения службы хранятся под ключ реестра:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\

Дополнительные параметры сохраняются в реестре по адресу:

HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\ProcRun 2.0\\Параметры

В 64-разрядной Windows procrun всегда используется 32-разрядный просмотр реестра для хранения конфигурации. Это означает, что параметры будут храниться внутри:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Apache Software Foundation\ProcRun 2.0\

Обновление 2

Tomcat настраивал, как работает сканер между точечными релизами. попробуйте перейти вперед через версии 7.25.7.26... и т.д., чтобы найти версию, с которой она ломается, просмотрите заметки о выпуске для этой версии, чтобы увидеть, изменились ли они, как работает сканер.

Еще одна вещь, которую вы можете попробовать, - создать еще один военный файл, в котором есть все сторонние банки в вашем WEB-INF\lib, но не ваш код. Посмотрите, если вы получите эту ошибку, если вы запустите, и если вы это сделаете, тогда должен подать отчет об ошибке с tomcat и предоставить им ваш образец проекта, который реплицирует проблему, на github или какую-либо другую бесплатную систему хостинга кода. Я уверен, что есть ошибка, которую они исправят.

Ответ 3

Чтобы исправить это для TC Server 2.9, запустив Tomcat 7.0.39, я запретил банкам пропустить во время запуска конфигурацию контекста, используя:

org.apache.catalina.startup.ContextConfig.jarsToSkip=*.jar

в каталитических свойствах.

Ответ 4

В моем случае iTextpdf JAR (версия 5.06) вызывает проблему, так как она зависела от org.bouncyCastle.*.jar и создавала циклическую зависимость.

После обновления до версии 5.5.6 работала отлично. Если вы добавляете зависимость maven, очищаете и обновляете проект maven.

<dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.6</version>
</dependency>

Ответ 5

Я не запускаю Tomcat в качестве службы Windows, поэтому, чтобы пройти -Xss10m через, я отредактировал catalina.bat, в нижней части:

:doJpda
if not "%SECURITY_POLICY_FILE%" == "" goto doSecurityJpda
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %JPDA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -Xss10m -classpath "%CLASSPATH%" -

Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
goto end