Tomcat项目加载顺序及重复加载问题探讨

因为这个博客网站要在项目启动时初始化一下东西,加载缓存什么的,发现每次部署到Linux上,
日志显示项目初始化两次,而idea启动就没事,我就分析是Tomcat的配置有问题,于是调试修改Tomcat配置文件。

假设webapps下有blog文件夹项目
修改 conf / server.xml 中host配置分别采用如下配置,会有如下结果
A: 下面项目会加载两次
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
	<Context path="" docBase="blog" debug="0" reloadable="false"/>
</Host>
B: 下面项目不会加载两次
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
	<Context path="/blog" docBase="blog" debug="0" reloadable="false"/>
</Host>
首先是知识点:
appBase 设置项目的根路径,即浏览器输入 “\” 会在的目录,可设为相对catalina_home的相对路径,也可以是绝对路径。
context  设置虚拟相对路径,path设置浏览器访问的相对路径,docBase设置此path的对应的绝对路径,也可以是相对于appBase的相对路径。
                其中path=""或path="ROOT",为设置此host的根路径。

经过修改配置测试很多次,及分析日志发现,tomcat运行过程如下
1、tomcat会先扫描部署 docBase 指定的项目
2、然后再部署appBase下的项目,这时就会跳过那些在docBase中已经部署过的文件夹(此文件夹名为相对路径文件夹名,不是绝对路径,即path的参数)

这也解释了为什么
<Context path="" docBase="blog" debug="0" reloadable="false"/>
这样会加载两次
因为path="" 与 path="ROOT" 等价,即此时已经部署的docBase文件夹为ROOT
再扫描appBase时,就会再次部署blog,因为先前部署的是ROOT

<Context path="/blog" docBase="blog" debug="0" reloadable="false"/>
不会加载两次
因为部署docBase时文件名为blog,扫描appBase时就会跳过blog。

实际部署时该怎么样部署
因为要实现的效果是能通过域名直接访问,而不要项目名
所以两个方式
一是 修改appBase到一个没有项目的目录,而context中的docBase指定项目的绝对路径
二是 将项目从webapps目录移动到一个新目录,appBase维持不变,context中的docBase指定项目的绝对路径


我的blog配置文件
webapps为空目录,项目移动到/root/webapps/下 
<Host name="imcoder.site"  appBase="webapps" unpackWARs="true" autoDeploy="true">
	<!-- 一个项目想要以多个host访问,可以通过设置别名的方式 -->
	<Alias>121.42.52.74</Alias>
	<Context path="" docBase="/root/webapps/blog" debug="0" reloadable="false"/>

	<Context path="/blog/upload" docBase="/root/webapps/blog/upload" debug="0" reloadable="false"/>
	<Context path="/cloud" docBase="/root/webapps/cloud" debug="0" reloadable="false"/>

        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="imcoder.site_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />

</Host> 
<!-- 配置单独的子域名来用于静态资源加速,这样有利于动静分离 
     配置单独的host作为CDN回源host,是这样有利于在tomcat分离静态资源,防止能通过加速子域名访问网站,从而产生镜像网站,不利于SEO -->
<Host name="static.imcoder.site"  appBase="webapps" unpackWARs="false" autoDeploy="true">

	<Context path="" docBase="/root/webapps/cloud" debug="0" reloadable="false"/>

	<Context path="/cloud" docBase="/root/webapps/cloud" debug="0" reloadable="false"/>
	<Context path="/blog/upload" docBase="/root/webapps/blog/upload" debug="0" reloadable="false"/>
	<Context path="/blog/js" docBase="/root/webapps/blog/js" debug="0" reloadable="false"/>
	<Context path="/blog/css" docBase="/root/webapps/blog/css" debug="0" reloadable="false"/>
	<Context path="/blog/template" docBase="/root/webapps/blog/template" debug="0" reloadable="false"/>
	<Context path="/blog/img" docBase="/root/webapps/blog/img" debug="0" reloadable="false"/>

	<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
		prefix="static_access_log" suffix=".txt"
		pattern="%h %l %u %t &quot;%r&quot; %s %b" />

</Host>

添加新评论