我刚花了2个多小时反编译看了下代码,应该是这样的过程,好精妙的
Part 1: 在应用的META-INF/context.xml下面配置数据源的必要性
Tomcat的部署应用过程在HostConfig目录下的deployApps() 方法中
实际就是做了以下结果事情->多种部署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中 , 贴上代码
不难发现,他会打开一个字节流从 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应用