問題發生背景:
由於公司的web環境大都是tomcat,所以在項目發佈出現小問題爲了快速解決時常會需要手動增加或修改war包解壓後的內容。但是在修改時有的webapps下除了war包解壓後的包文件,還會多出一個ROOT文件夾,而且開發通常都會告訴我:別忘了修改ROOT裏面的內容。
爲什麼呢,爲什麼還要修改ROOT下的內容?
下面先講解tomcat下webapps中ROOT的作用
tomcat下webapps中ROOT目錄的作用:
在初學tomcat時當部署完tomcat,我們輸入IP:8080默認端口時通常會出現一個tomcat的歡迎界面,而這個歡迎界面就在webapps的ROOT中。
一般tomcat的訪問是"IP:端口/包名"形式的
但ROOT的作用則是省去了包名使得訪問tomcat的war包項目只需要"IP:端口"就可以,這可以簡化反代的配置。不需要反向代理時寫死包名,使得更換項目時不必再對反向代理進行修改。在一定程度上減少了運維人員的工作量。
ROOT目錄是怎麼出現的呢
剛開始由於對tomcat一無所知,因此對ROOT的出現很是困惑,爲什麼每次發佈前我都把ROOT刪掉,在發佈後ROOT總是再度出現。之前需要對發佈後的項目進行小範圍改動時,不知道爲什麼還要對ROOT進行修改。直到現在才明白對發佈後的項目修改時爲什麼一定要修改ROOT
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