我刚花了2个多小时反编译看了下代码,应该是这样的过程,好精妙的

 

Part 1 在应用的META-INF/context.xml下面配置数据源的必要性

 

Tomcat的部署应用过程在HostConfig目录下的deployApps() 方法中

 


Tomcat 部署项目细节深入研究_第1张图片

 

 


Tomcat 部署项目细节深入研究_第2张图片

 

实际就是做了以下结果事情->多种部署tomcat应用的方式

(1)      部署 %CATALINA_HOME%/conf/Catalina/localhost 目录下面的 .xml  

deployDescriptors(configBase, configBase.list());

(2)     部署 %CATALINA_HOME%/webapps/ 目录下以.war 结尾的文件

deployWARs(appBase, filteredAppPaths);

(3)     部署%CATALINA_HOME%/webapps 目录下的目录,也就是没有打包的那些应用

deployDirectories(appBase, filteredAppPaths);

 

而我们的问题就在第二种和第三种部署方式里面,

deployWARs (部署所有的war)里面是一个for循环,来依次调用deployWAR( 部署单个war)

deployWAR , 贴上代码


Tomcat 部署项目细节深入研究_第3张图片

 

不难发现,他会打开一个字节流从 war文件中读取 META-INF/context.xml 文件,然后把它 copy

      %CATALINA_HOME%/conf/Catalina/localhost/下于war应用名称相对应的xml文件中,也就是这里的


也就是%CATALINA_HOME%/conf/Catalina/localhost

 

Tomcat 部署项目细节深入研究_第4张图片

所以,这个目录,还是必要的。

 

 

Part 2tcServerTomcat的关系:

tcServer不同于普通的tomcat,他的%CATALINA_HOME%/conf/Catalina/localhost 根本没有,其实是这样的,他很精妙的吧部署目录指向了

%TCSERVER_HOME%\spring-insight-instance,为什么这么说呢?

%TCSERVER_HOME%\tcruntime-ctl.bat

 

也就是说INSTANCE_BASE 设为了当前目录,也就是%TCSERVER_HOME%


Tomcat 部署项目细节深入研究_第5张图片

素所以我们可以看到,CATALINA_BASECATALINA_HOME都被设置为了%TCSERVER_HOME%/%1 ,而这个%1是第一个参数spring-insight-instance,所以CATALINA_BASECATALINA_HOME都被设置为%TCSERVER_HOME%/spring-insight-instance

下面就迎刃而解了。

 

Part 3:验证结论

我们在%TCSERVER_HOME% \spring-insight-instance\conf\Catalina\localhost 下果然找到了estore.xml, 符合<项目名>.xml的风格


Tomcat 部署项目细节深入研究_第6张图片

打开看下, 发现里面的内容正是从META-INF/context.xml中复制来的,并且用docBase指向了来源。于是Part 1的论点得到证明。对比下面两张图

 

estore.xml


Tomcat 部署项目细节深入研究_第7张图片

META-INF/context.xml


 

然后tcServer就可依据estore.xml来部署estore应用