问题发生背景:web
因为公司的web环境大都是tomcat,因此在项目发布出现小问题为了快速解决时常会须要手动增长或修改war包解压后的内容。可是在修改时有的webapps下除了war包解压后的包文件,还会多出一个ROOT文件夹,并且开发一般都会告诉我:别忘了修改ROOT里面的内容。spring
为何呢,为何还要修改ROOT下的内容?tomcat
下面先讲解tomcat下webapps中ROOT的做用
bash
tomcat下webapps中ROOT目录的做用:app
在初学tomcat时当部署完tomcat,咱们输入IP:8080默认端口时一般会出现一个tomcat的欢迎界面,而这个欢迎界面就在webapps的ROOT中。运维
通常tomcat的访问是"IP:端口/包名"形式的webapp
但ROOT的做用则是省去了包名使得访问tomcat的war包项目只须要"IP:端口"就能够,这能够简化反代的配置。不须要反向代理时写死包名,使得更换项目时没必要再对反向代理进行修改。在必定程度上减小了运维人员的工做量。ide
ROOT目录是怎么出现的呢url
刚开始因为对tomcat一无所知,所以对ROOT的出现非常困惑,为何每次发布前我都把ROOT删掉,在发布后ROOT老是再度出现。以前须要对发布后的项目进行小范围改动时,不知道为何还要对ROOT进行修改。直到如今才明白对发布后的项目修改时为何必定要修改ROOTspa
ROOT的意义在前面已经说到了,它能够简化访问的url,同时在项目包名变动时没必要对反向代理进行额外的修改。
ROOT的出现与conf/server.xml配置文件有关
在server.xml文件中有项额外的配置是
<Context path="" reloadable="true" docBase="/deploy/to/war" />
docBase能够是war包的路径也能够是war包解压后的文件夹名的路径
xxx.war形式
<Context path="" reloadable="true" docBase="/opt/xxx.war" />
例如xxx.war在/opt下,docBase能够写成docBase="/opt/xxx.war",此时启动tomcat,在engine的默认webapps下会生成一个名为ROOT的文件夹,该文件夹内就是xxx.war解压后的内容。
经过查看日志能够发现一则信息
DEBUG [localhost-startStop-1] - Published root WebApplicationContext as ServletContext attribute with name [org.springframework.web.context.WebApplicationContext.ROOT]
该信息大意:将ServletContext中的定义的包解压后的内容发布到ROOT文件夹下。
xxx文件夹形式
<Context path="" reloadable="true" docBase="xxx" />
注:docBase有绝对路径跟相对路径之分,相对路径是相对于engine引擎定义的webapps
若是docBase指定的路径为xxx.war包解压后文件夹的形式,则须要将xxx.war放在webapps下,其过程大体为:tomcat先将xxx.war解压为xxx文件,以后将xxx文件夹复制为以ROOT为名字的新文件夹。
总结:
tomcat访问IP:端口的方式访问war包项目的方式是比较方便的,我也建议这么作。不过发布时记得删除ROOT文件夹,不然在你发布后你会发现你此次发布的没有任何变化,若发布后出现小问题须要快速解决,记得是要对ROOT下的内容进行修改而不是解压的war包内容。
如今我才知道开发通知告诉个人其实只有一半是正确的,那就是修改ROOT!。
我所写的不必定全对,不过通过实验验证,目前没发现错误,若是有哪里说的有误欢迎指正。
参考资料
http://blog.163.com/jianhuren2005@126/blog/static/1715817120071015115620650/
http://blog.knowsky.com/206846.htm