1. 出现场景
发布web应用至 tomcat/webapps,默认方式下访问该项目是需要带项目名称的,例http://localhost:8080/myapp/。
现在需要改成这样访问http://localhost。
修改tomcat的server.xml文件,增加如下配置<Context path="" docBase="myapp" reloadable="false"/>,修改后host部分如下:
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="false">
<Context path="" docBase="myapp" reloadable="false"/>
</Host>
此时每次启动tomcat观察日志都会发现应用加载了两次,什么原因呢?
2. 问题原因
虚拟目录引起的问题:
<Host/>标签里面配置了appBase="webapps",在tomcat启动的时候加载webapps下的所有项目工程文件;
在<Context/> 标签里面配置了一次docBase,让tomcat又去加载一次应用(一般情况下配置<Context/>,主要是由于想域名访问时将工程名去掉,也就是工程项目直接使用tomcat中设置的端口号就能访问)。
3. 解决办法一
<Host/>标签里面的appBase不指定位置,而是在<Context/> 标签里的docBase指定,防止项目会自动启动两遍,也就是将appBase="webapps" 置为 appBase="",docBase="myapp"置为docBase="webapps/myapp"。配置如下:
<Host name="localhost" appBase=""
unpackWARs="true" autoDeploy="false">
<Context path="" docBase="webapps/myapp" reloadable="false"/>
</Host>
说明:如果你的项目中的链接或者图片写的都是绝对路径的话,那么带有项目名称的绝对路径是不可以使用的。
这样呢,产生了一个新的问题,将appBase置空,这个时候就不会自动解压war包,不知道会不会有后遗症,o(╥﹏╥)o,好在不会影响web的访问。——跪求指教。
4.解决办法二
网上的一种说法:<Host/>标签里面的改成 deployXML ="false" deployOnStartup ="false" autoDeploy="false",避免tomcat服务器中自启动导致项目被加载两次(如果是定时任务,比如群发,可想而知多么恐怖。。。)。(当然还可以按需求修改,毕竟每个项目的需求都不尽相同。)
含义:
deployXML ="false" : 不部署conf/catalina/localhost下的xml相应的WEB应用
deployOnStartup ="false" :tomcat启动时, 不自动部署webapps下的所有web应用
autoDeploy ="false" :如果此项设为true,表示Tomcat服务处于运行状态时,能够监测appBase下的文件,
如果有新有web应用加入进来,会自运发布这个WEB应用,
设成false避免tomcat在扫描改动时, 再次把webapps下的web应用给部署进来.
最后host配置如下:
<Host name="localhost" appBase="webapps"
unpackWARs="true" deployXML ="false" deployOnStartup ="false" autoDeploy="false">
<Context path="" docBase="yunmas_biz"/>
</Host>
这样的话,在tomcat启动时,不会自动发布appBase下的应用,启动后也不会自动发步appBase下的应用。
这次呢,嗯,myapp.war包解压到了tomcat/webapps/ROOT,o(╥﹏╥)o,随它去吧,阿弥陀佛。