红联Linux门户
Linux帮助

Tomcat8下将webapps目录与tomcat目录分离

发布时间:2016-09-28 11:32:04来源:linux网站作者:bladestone
引言:在实际的生产环境中,默认情况下会将tomcat目录和时间部署目录进行分离,而非我们在开发环境下的将其放入$CATALINA_HOME/webapps下,那如何来实现这个功能呢?本文将回答此问题。
 
1.环境介绍
tomcat 8.0.35,OS:Centos 6.2,JDK 1.8
 
2.tomcat下conf目录分析
我们需要关注的是其下server.xml中的配置信息,其中的Host的配置中默认情况为:
<Host name="localhost"  appBase="webapps"  
unpackWARs="true" autoDeploy="true">  
<!-- SingleSignOn valve, share authentication between web applications  
Documentation at: /docs/config/valve.html -->  
<!-- 
<Valve className="org.apache.catalina.authenticator.SingleSignOn" /> 
-->  
<!-- Access log processes all example.  
Documentation at: /docs/config/valve.html  
Note: The pattern used is equivalent to using pattern="common" -->  
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"  
prefix="localhost_access_log" suffix=".txt"  
pattern="%h %l %u %t "%r" %s %b" />  
</Host>  
其默认会将首页映射到$CATALINA_HOME/webapps/ROOT, 从官网上下载内容,默认为tomcat的管理控制台。
 
3.如何来修改?
同样关注server.xml配置文件,做如下配置:
<Host name="localhost"  appBase="webapps"  
unpackWARs="true" autoDeploy="true">  
<!-- SingleSignOn valve, share authentication between web applications  
Documentation at: /docs/config/valve.html -->  
<!-- 
<Valve className="org.apache.catalina.authenticator.SingleSignOn" /> 
-->  
<!-- Access log processes all example.  
Documentation at: /docs/config/valve.html  
Note: The pattern used is equivalent to using pattern="common" -->  
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"  
prefix="localhost_access_log" suffix=".txt"  
pattern="%h %l %u %t "%r" %s %b" />  
<Context path="" docBase="/opt/apps/course/orff" reloadable="true" debug="0" crossContext="true"/>  
</Host>
请注意新增了一个Context及其相应的属性信息:
path:指定访问该Web应用的URL入口
docBase:指定Web应用的文件路径,可以给定绝对路径,也可以给定相对于<Host>的appBase属性的相对路径,如果Web应用采用开放目录结构,则指定Web应用的根目录,如果Web应用是个war文件,则指定war文件的路径。(指定项目所在地址)
reloadable:如果这个属性设为true,tomcat服务器在运行状态下会监视在WEB-INF/classes和WEB-INF/lib目录下class文件的改动,如果监测到有class文件被更新的,服务器会自动重新加载Web应用
crossContext: 
From the javadoc ServletContext.getContext():
This method allows servlets to gain access to the context for various parts of the server, and as needed obtain RequestDispatcher objects from the context. The given path must be begin with "/", is interpreted relative to the server's document root and is matched against the context roots of other web applications hosted on this container.
So for instance if you want to include a page from a different webapp you need to set crossContext to true.
You can share sessions between web applications by using a Single Sign-On Valve.
You would set crossContext=true if you wanted to share some information between different Web Applications in the same Virtual Host.
For example app1 would call:
setAttribute("name", object);
and another app could call
getContext("app1").getAttribute("name");
to read the information. If crossContext wasn't set to true, the getContext("app1") would have returned null.
crossContext用来设置在不同的虚拟目录应用下Session的共享。
新增的Context节点将覆盖其默认的webapps部署目录,从而将其部署与tomcat目录进行分离。
 
4.tomcat中的虚拟目录和主目录
虚拟目录:在我们在webapps中部署一个目录之时,会在catalina_home/conf/CATALINA/localhost目录下,默认生成一个ROOT.xml.其默认的内容如下
<?xml version='1.0' encoding='utf-8'?>  
<Context crossContext="true" docBase="/opt/apps/course/orff" path="" reloadable="true">  
</Context>  
这里设置的虚拟目录的信息。
使用场景:在我们在server.xml中删除了相应的context信息之后,如果发现不生效,则需要关注一下conf/Catalina/localhost下的相应文件,删除之后,重新启动即可解决类似问题。
 
5.主目录和虚拟目录的解析顺序
tomcat首先到conf/Catalina/localhost下解析其虚拟目录的信息,如果有则顺利跳转;如果虚拟目录不存在,则进入server.xml中的context部分进行解析,然后正常进行跳转,跳转进入正常的页面流转。
由此可知:我们可以在虚拟目录和主目录两个位置来进行配置Context的目录信息,至于哪一个位置更好,大家可以自由选定,默认是server.xml为宜。
 
6.总结
主目录、虚拟目录;Tomcat下部署目录和Tomcat安装目录的分离,都在Context中进行体现。
 
本文永久更新地址:http://www.linuxdiyf.com/linux/24560.html