今天发现部署war到tomcat中报了很多错,包括数据表锁死等问题,仔细看日志,发现一些初始化程序,和定时任务都执行了两遍,觉得很奇怪。
想起今天再tomcat的server配置了context如下:
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> <Context path="" docBase="synchronize-web" debug="0" reloadable="true"/> </Host>
原来是我把war放在webapps下面,host把war就执行了一遍,然后context又执行了一遍,我觉得这算bug了,我context配置相对路径,就不要重复加载程序了嘛。
我之所以配置context是希望把项目文件夹作为root目录,这样访问时就不用带项目名。
解决方法:配置host或者context,让他们配置的目录不要交叉,都用绝对路径,也可以context的docBase直接指向外面目录的war。
<Host name="localhost" appBase="" unpackWARs="false" autoDeploy="false" xmlValidation="false" xmlNamespaceAware="false"> <Context path="" docBase="C:\Program Files\Tomcat 6.0\webapps\XXX\" workDir="C:\Program Files\Tomcat 6.0\webapps\XXX5xun5mi\" /> </Host>
注意:问题是解决了,你要时对context不熟,还是不要用context了,因为太多不可控了,官方也不建议用。
所以我最后还是去掉了context,每次部署把war包改成ROOT.war放到webapps里面。