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

使用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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值