問題發生背景: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