错误信息:
Caused by: java.lang.IllegalStateException: Illegal access: this web application instance has been stopped already. Could not load [META-INF/services/javax.xml.parsers.DocumentBuilderFactory]. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access.
at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading(WebappClassLoaderBase.java:1335)at org.apache.catalina.loader.WebappClassLoaderBase.findResources(WebappClassLoaderBase.java:973)
at java.lang.ClassLoader.getResources(ClassLoader.java:1139)
at java.util.ServiceLoader$LazyIterator.hasNextService(ServiceLoader.java:348)
at java.util.ServiceLoader$LazyIterator.hasNext(ServiceLoader.java:393)
at java.util.ServiceLoader$1.hasNext(ServiceLoader.java:474)
at javax.xml.parsers.FactoryFinder$1.run(FactoryFinder.java:293)
at java.security.AccessController.doPrivileged(Native Method)
at javax.xml.parsers.FactoryFinder.findServiceProvider(FactoryFinder.java:289)
at javax.xml.parsers.FactoryFinder.find(FactoryFinder.java:267)
at javax.xml.parsers.DocumentBuilderFactory.newInstance(DocumentBuilderFactory.java:120)
at org.springframework.beans.factory.xml.DefaultDocumentLoader.createDocumentBuilderFactory(DefaultDocumentLoader.java:90)
at org.springframework.beans.factory.xml.DefaultDocumentLoader.loadDocument(DefaultDocumentLoader.java:71)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadDocument(XmlBeanDefinitionReader.java:429)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:391)
... 19 more
原因:因为在tomcat重启的时候,因为之前的tomcat中的线程还没有完全关闭,新启动tomcat就会报这个异常
解决方案:
网上有很多解决方案是将Context中的reloadable设置为false,但是我们项目没有设置context,既然是由于线程没有关闭导致的,那么将现有线程先关闭,然后在重启就可以了,使用python脚本如下(最好是写成一个脚本,两个还是比较麻烦的)
a.py
#coding:utf-8
import os
if __name__ == '__main__':
##重新加载前删除当前执行的app
ret1 = os.popen('curl --upload-file ./abc.war -u admin:Pdmi1234 "http://172.17.1.57:8080/manager/text/deploy?path=/abc&update=true"')
##打印返回值
print ret1.read()
print '-------------------------------------------------'
det1 = os.popen('curl -u admin:Pdmi1234 "http://172.17.1.57:8080/manager/text/stop?path=/abc"')
print det1.read()
等待a.py执行成功并且返回值都为OK,执行b.py
#coding:utf-8
import os
if __name__ == '__main__':
##重新加载前删除当前执行的app
det11 = os.popen('curl -u admin:Pdmi1234 "http://172.17.1.57:8080/manager/text/start?path=/abc"')
print det11.read()