您的位置:首页 > 运维架构 > Tomcat

Tomcat 部署项目细节深入研究

2012-04-14 17:00 344 查看
我刚花了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 2tcServerTomcat的关系:

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

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

%TCSERVER_HOME%\tcruntime-ctl.bat





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





素所以我们可以看到,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的风格





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

estore.xml





META-INF/context.xml





然后tcServer就可依据estore.xml来部署estore应用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息