您的位置:首页 > 运维架构 > Tomcat

使用tomcat manage发布项目报错Illegal access: this web application instance has been stopped already

2016-06-07 15:00 453 查看
错误信息:

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()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: