【转载】Tomcat 7.0.3x 启动慢并且遇到StackOverflowError的异常的解决办法

严重: ContainerBase.addChild: start: 
org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/mypro]] 
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:441) 
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:619) 
Caused by: java.lang.IllegalStateException: Unable to complete the scan for annotations for web application [/mypro]. 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.HashMap.get(HashMap.java:300) 
at org.apache.catalina.startup.ContextConfig.populateSCIsForCacheEntry(ContextConfig.java:2257) 
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) 
……
 

在网上找了很久,最终解决问题,在这时MARK一下。以下是解决方法: 

--------------------------------------------------以下文章为转载--------------------------------------------------  

使用tomcat 7.0.3x版本的同学可以发现tomcat启动慢了不少,而且还可能遇到如下启动时异常: 

Unable to complete the scan for annotations for web application [] due to a StackOverflowError. Possible root causes include a too low setting for -Xss and illegal cyclic inheritance dependencies. 

tomcat7.0.3X版本支持servlet3.0的特性,比如说支持@WebServlet、@WebListener,要支持这些特性,tomcat就得去扫描所有的jar包里面的每个类。这个异常表明在扫描jar包的时候,递归调用太深,导致栈溢出了,tomcat给了一个馊主意,让你增大xss,这个还是不好,xss加大了,可用线程数就少了。 

分析tomcat源代码,发现它扫描的流程如下: 

1.扫描所有jar包 

2.通过查找jar包中META-INF/services/javax.servlet.ServletContainerInitializer文件内的定义,初始化ServletContainerInitializer实现 

3.如果web.xml中配置了metadata-complete="true" 或者没有找到ServletContainerInitializer实现,都不会继续扫描jar包 

网上大多数的答案的都是说在web.xml中加入了metadata-complete="true"就能避免这个异常。确实在很多场景下,这个异常是能够避免。但是使用spring-web-3.1.0.RELEASE的同学就杯具了,这个jar包中定义了一个ServletContainerInitializer,还是导致了扫描jar包。 

我们可以用另外的办法来解决这个问题,我们让tomcat不扫描指定的jar包,tomcat就要轻松得多了,org.apache.tomcat.util.scan.StandardJarScanner中定义了defaultJarsToSkip,有了这个东东,我们就可以跳过某些jar包。 

如果你不想使用servlet3.0 annotation支持,在tomcat的catalina.properties配置文件中tomcat.util.scan.DefaultJarScanner.jarsToSkip的值后面加一个",*",这样就不会扫描所有的jar包了。启动更快,也不会出异常。 


tomcat在处理扫描是还有个小bug,比如我遇到了 

SEVERE: Unable to process Jar entry [__MACOSX/cn/****/._HandlerFactory.class] from... 

这是tomcat在扫描到以.class为后缀的文件后,就分析类,很明显,此文件都不是java类文件。tomcat不应该只判断后缀为.class就是java类文件。
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个错误是因为你的项目中使用了 node-sass 包,但是它的版本号是 7.0.3,而你的项目中要求的版本号是 ^4.0.0。这两个版本不兼容,所以会出现这个错误。你需要升级或降级 node-sass 包的版本,使其与你的项目要求的版本号相符。 ### 回答2: 该错误信息意味着您的应用程序正在尝试使用与所需版本不兼容的 Node Sass 版本。 Node Sass 是一种将 SASS 文件编译为 CSS 的 Node.js 模块。它在许多应用程序框架中使用,例如 Angular,React 和 Vue。在某些情况下,Node Sass 可能不与应用程序版本兼容。 在这种情况下,您可能需要升级或降级 Node Sass 版本以使其与应用程序兼容。最好的做法是使用当前应用程序版本所支持的最新版本的 Node Sass。您可以在 https://www.npmjs.com/package/node-sass 上找到可用的节点 Sass 版本列表。 如果应用程序支持比您当前使用的 Node Sass 版本较旧的版本,则可以降级到该版本以解决此问题。您可以使用以下命令来降级节点 Sass 版本: npm install node-sass@<desired-version> 在 <desired-version> 中,将所需的节点 Sass 版本替换为要降级到的版本号。 另外,您可能需要更新您的应用程序依赖项和 package.json 文件以确保所有依赖项和版本都正确。您可以使用以下命令来更新 npm 包: npm update 总之,要解决 node Sass 版本不兼容的错误,您应该首先确保应用程序使用的节点 Sass 版本与所需版本兼容。如果不是,您可以升级或降级节点 Sass 版本以解决问题。还应确保所有依赖项和版本都正确。 ### 回答3: 这个错误提示是因为使用npm或yarn安装某个package时,package内部依赖sass-loader和node-sass两个工具。但sass-loader对于node-sass的版本有限制,需要在package.json中声明node-sass的版本,否则会出现上述错误提示。 这个错误的解决方法有两个: 1. 升级或降级node-sass版本 首先需要查看package.json文件中的node-sass版本号,然后在命令行中输入以下代码升级或降级node-sass版本: npm install node-sass@<version> --save-dev 其中<version>是需要安装的node-sass版本号。 2. 更新package依赖 如果升级或降级node-sass版本无效,可以尝试更新package内的依赖。在命令行中输入以下代码: npm update 这个命令会更新package.json中所有的依赖。更新后再次运行程序看是否解决了问题。 总的来说,解决这个问题的方法主要是升级或降级node-sass版本、更新package依赖。如果这些方法依然无效,可以考虑重装npm或yarn。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值