Tomcat有时候会重复加载配置文件,这是由于server.xml配置不当造成的。
现象:
quartz定时执行了两遍(其它配置文件其实也加载了两遍)
server.xml配置:
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Context path="" docBase="frms4j" reloadable="true"/> </Host>
原理:
在Web环境里,会使用ContextLoader构造ApplicationContext后,压进ServletContext。
由ContextLoaderListener或ContextLoaderServlet,在Web应用启动时完成。
出现上述问题的原因是tomcat加载玩appBase="webapps"之后又去加载docBase,因此造成加载两次项目的问题。
解决:
当然解决办法有很多,主要是在server.xml配置上做手脚:
1、撤销掉<Context>标签,但是URL中需要加入项目web路径
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> </Host>
2、在Tomcat下新建newWebapps,然后修改server.xml
<Host name="localhost" appBase="newWebapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Context path="" docBase="../webapps/frms4j" reloadable="true"/> </Host>优点:不影响Eclipse的集成部署
注意:可能会引发问题,找不到manager和host-manager目录,把这两个目录拷贝到新指向的目录即可
3、新建目录myapps平级于webapps,然后修改server.xml
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Context path="" docBase="../myapps/frms4j" reloadable="true"/> </Host>
4、在webapps目录下新建目录myapp,然后修改server.xml
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Context path="" docBase="/myapp/frms4j" reloadable="true"/> </Host>
类似问题:http://grokbase.com/t/tomcat/users/02cy9aaq8n/application-context-loaded-twice
参考:http://www.myexception.cn/web/665108.html