我剛花了2個多小時反編譯看了下代碼,應該是這樣的過程,好精妙的web
Part 1: 在應用的META-INF/context.xml下面配置數據源的必要性
Tomcat的部署應用過程在HostConfig目錄下的deployApps() 方法中tomcat
實際就是作了如下結果事情->多種部署tomcat應用的方式app
(1) 部署 %CATALINA_HOME%/conf/Catalina/localhost 目錄下面的 .xml webapp
deployDescriptors(configBase, configBase.list());ide
(2)
部署 %CATALINA_HOME%/webapps/ 目錄下以.war 結尾的文件
deployWARs(appBase, filteredAppPaths);
(3)
部署%CATALINA_HOME%/webapps 目錄下的目錄,也就是沒有打包的那些應用
deployDirectories(appBase, filteredAppPaths);
而咱們的問題就在第二種和第三種部署方式裏面,
deployWARs (部署全部的war)裏面是一個for循環,來依次調用deployWAR( 部署單個war)
而deployWAR中 , 貼上代碼
不難發現,他會打開一個字節流從 war文件中讀取 META-INF/context.xml 文件,而後把它 copy 到
%CATALINA_HOME%/conf/Catalina/localhost/下於war應用名稱相對應的xml文件中,也就是這裏的
也就是%CATALINA_HOME%/conf/Catalina/localhost
因此,這個目錄,仍是必要的。
Part 2,tcServer和Tomcat的關係:
tcServer不一樣於普通的tomcat,他的%CATALINA_HOME%/conf/Catalina/localhost 根本沒有,實際上是這樣的,他很精妙的吧部署目錄指向了
%TCSERVER_HOME%\spring-insight-instance,爲何這麼說呢?
在%TCSERVER_HOME%\tcruntime-ctl.bat 中
也就是說INSTANCE_BASE 設爲了當前目錄,也就是%TCSERVER_HOME%
素因此咱們能夠看到,CATALINA_BASE和CATALINA_HOME都被設置爲了%TCSERVER_HOME%/%1 ,而這個%1是第一個參數spring-insight-instance,因此CATALINA_BASE和CATALINA_HOME都被設置爲%TCSERVER_HOME%/spring-insight-instance
下面就迎刃而解了。
Part 3:驗證結論
咱們在%TCSERVER_HOME% \spring-insight-instance\conf\Catalina\localhost 下果真找到了estore.xml, 符合<項目名>.xml的風格
打開看下, 發現裏面的內容正是從META-INF/context.xml中複製來的,而且用docBase指向了來源。因而Part 1的論點獲得證實。對比下面兩張圖
estore.xml
META-INF/context.xml
而後tcServer就可依據estore.xml來部署estore應用