在Linux或Mac下,启动Tomcat时会报以下错误:
Caused by: java.lang.IllegalStateException: Unable to complete the scan for annotations for web application [/cmi] due to a StackOverflowError. Possible root causes include a too low setting for -Xss and illegal cyclic inheritance dependencies. The class hierarchy being processed was [org.bouncycastle.asn1.ASN1EncodableVector->org.bouncycastle.asn1.DEREncodableVector->org.bouncycastle.asn1.ASN1EncodableVector]
at org.apache.catalina.startup.ContextConfig.checkHandlesTypes(ContextConfig.java:2174)
at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:2112)
at org.apache.catalina.startup.ContextConfig.__processAnnotationsJar(ContextConfig.java:2058)
at org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:55017)
at org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:2028)
at org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:1981)
at org.apache.catalina.startup.ContextConfig.processClasses(ContextConfig.java:1237)
at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1136)
at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:768)
at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:301)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5034)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
... 50 more
通过上面的错误信息,第一眼看起来是因为-Xss的值设置的比较小,但是调整-Xss的参数方法是不正确的。其中 -Xss的解释如下:
-Xss:每个线程的Stack大小,“-Xss 15120” 这使得tomcat每增加一个线程(thread)就会立即消耗15M内存,而最佳值应该是128K,默认值好像是512k.
解决方案如下:
后面看到的错误信息 org.bouncycastle.asn1.ASN1EncodableVector 是出在这个类上,
这是因为tomcat启动会去扫描jar,这个类是出现在bcprov.jar这个包。所以在tomcat的conf目录里面catalina.properties的文件中
在tomcat.util.scan.StandardJarScanFilter.jarsToSkip=里面加上bcprov.jar过滤启动不会报错了
具体如下:
自己的Tomcat版本是8.5.38
另外网上的另一种解决方案是升级Tomcat版本。自己也试了一下。用Tomcat9.0.6 也会出现这个问题,只不过频率比较低。