Tomcat 5.5.23 文档阅读Tips 3 - Deployer
本文介绍了如何在tomcat中部署一个web app。
1. 在tomcat中部署一个web app有两类做法。第一,静态部署。此类部署就是将web app的文件拷贝到相应的路径,作一些配置,然后重启tomcat,在tomcat启动的过程中,会将这个web应用部署到tomcat中。第二,动态部署。动态部署tomcat支持两种方式,第一就是使用tomcat manager,这是tomcat 5 core包中就自带的一个web app,用这个tomcat manager就可以动态的部署一个web应用,无需重启tomcat;第二,使用tomcat deployer,这个包可以在tomcat 5的网站上下载,相比tomcat manager,tomcat deployer(也就是TCD-Tomcat Client Deployer)提供了更多的功能。TCD部署应用就是通过一个命令行的界面和tomcat manager做交互,最终达到部署的目的,不过相比manager,TCD提供了编译,验证一个web应用,将一个web应用打包成war文件的额外功能。TCD的安装需要预先安装JRE和ANT,而且对于EasyCluster来说,我们不太需要这个东西,所以这里就不对TCD做描述了,有兴趣的话可以直接看这篇tomcat的文档。
2. 下面描述在tomcat中部署一个应用的逻辑和配置。在Tomcat 4.x中,我们都知道,要部署一个web应用,要修改server.xml,在其中加入<context....这样的配置,对于tomcat来说,一个context就是一个web应用。在Tomcat 5中,情况有些变化,context的概念没变,但是Tomcat 5不鼓励将context的配置直接写在server.xml中,这也是一个清晰逻辑的好做法,那么,在Tomcat 5中,tomcat 5是如何查找一个web应用的context配置的呢?逻辑如下:
(1). $CATALINA_HOME/conf/[enginename]/[hostname]/context.xml
(2). $CATALINA_HOME/webapps/[webappname]/META-INF/context.xml
Tomcat 5就是到上面的两个地方去查找web应用的context配置的。这里enginename可以在server.xml中进行配置,默认就是Catalina(也就是Tomcat 5的包解开后在server.xml中的配置)。如果我们没有配置一个web应用的context,而我们已经将web应用的文件拷贝到了相应的位置,那么Tomcat 5会自动为我们在(1)的这个路径下创建一个名为[webappname].xml的context配置。不过注意,如果我们手动配置了context,那么,文件名不一定要是[webappname].xml,因为Tomcat在判定一个web app的名字的时候,是根据context中的配置,而不是文件名。
3. 下面开始介绍如何用静态部署的方法在tomcat中部署一个web app。这很简单,在server.xml中,有一个配置叫Host,在Host的配置中,可以配置一个叫appBase的attribute(可以在server.xml中搜索该关键字),这就是tomcat查找web app的根目录。默认情况下,这个appBase就是webapps,也就是说,我们只需要把web app的文件拷贝到这个appBase指定的目录下,然后重启tomcat,tomcat就会为我们部署这个应用。(也可以将war文件拷贝到appBase指定的目录下,效果是一样的)。
具体来说,tomcat在启动的时候,是这样部署应用的:
(1) 首先查找所有的Context Descriptor,也就是2点中提到的那两个查找路径,tomcat在这两个路径下查找所有的context的配置,优先部署这些应用。
(2) tomcat在appBase指定的目录下查找web应用并部署。如果发现一个web应用既有文件目录的形式,也有一个对应的war文件,那么查看war文件的时间戳和对应文件,目录的时间戳,如果war文件的时间戳比较新,那么解开war文件,再部署该应用。
(3) 部署剩余的war文件。
注:如果在server.xml中,定义了deployOnStartup=false,那么tomcat将不会执行上述的静态部署逻辑。此外,正如2中所说,如果tomcat在部署一个web app的时候,没有找到对应的context配置(Context Descriptor),也就是说,我们没有手动配置context,那么,tomcat会在$CATALINA_HOME/conf/[enginename]/[hostname]目录下自动生成一个。
1. 在tomcat中部署一个web app有两类做法。第一,静态部署。此类部署就是将web app的文件拷贝到相应的路径,作一些配置,然后重启tomcat,在tomcat启动的过程中,会将这个web应用部署到tomcat中。第二,动态部署。动态部署tomcat支持两种方式,第一就是使用tomcat manager,这是tomcat 5 core包中就自带的一个web app,用这个tomcat manager就可以动态的部署一个web应用,无需重启tomcat;第二,使用tomcat deployer,这个包可以在tomcat 5的网站上下载,相比tomcat manager,tomcat deployer(也就是TCD-Tomcat Client Deployer)提供了更多的功能。TCD部署应用就是通过一个命令行的界面和tomcat manager做交互,最终达到部署的目的,不过相比manager,TCD提供了编译,验证一个web应用,将一个web应用打包成war文件的额外功能。TCD的安装需要预先安装JRE和ANT,而且对于EasyCluster来说,我们不太需要这个东西,所以这里就不对TCD做描述了,有兴趣的话可以直接看这篇tomcat的文档。
2. 下面描述在tomcat中部署一个应用的逻辑和配置。在Tomcat 4.x中,我们都知道,要部署一个web应用,要修改server.xml,在其中加入<context....这样的配置,对于tomcat来说,一个context就是一个web应用。在Tomcat 5中,情况有些变化,context的概念没变,但是Tomcat 5不鼓励将context的配置直接写在server.xml中,这也是一个清晰逻辑的好做法,那么,在Tomcat 5中,tomcat 5是如何查找一个web应用的context配置的呢?逻辑如下:
(1). $CATALINA_HOME/conf/[enginename]/[hostname]/context.xml
(2). $CATALINA_HOME/webapps/[webappname]/META-INF/context.xml
Tomcat 5就是到上面的两个地方去查找web应用的context配置的。这里enginename可以在server.xml中进行配置,默认就是Catalina(也就是Tomcat 5的包解开后在server.xml中的配置)。如果我们没有配置一个web应用的context,而我们已经将web应用的文件拷贝到了相应的位置,那么Tomcat 5会自动为我们在(1)的这个路径下创建一个名为[webappname].xml的context配置。不过注意,如果我们手动配置了context,那么,文件名不一定要是[webappname].xml,因为Tomcat在判定一个web app的名字的时候,是根据context中的配置,而不是文件名。
3. 下面开始介绍如何用静态部署的方法在tomcat中部署一个web app。这很简单,在server.xml中,有一个配置叫Host,在Host的配置中,可以配置一个叫appBase的attribute(可以在server.xml中搜索该关键字),这就是tomcat查找web app的根目录。默认情况下,这个appBase就是webapps,也就是说,我们只需要把web app的文件拷贝到这个appBase指定的目录下,然后重启tomcat,tomcat就会为我们部署这个应用。(也可以将war文件拷贝到appBase指定的目录下,效果是一样的)。
具体来说,tomcat在启动的时候,是这样部署应用的:
(1) 首先查找所有的Context Descriptor,也就是2点中提到的那两个查找路径,tomcat在这两个路径下查找所有的context的配置,优先部署这些应用。
(2) tomcat在appBase指定的目录下查找web应用并部署。如果发现一个web应用既有文件目录的形式,也有一个对应的war文件,那么查看war文件的时间戳和对应文件,目录的时间戳,如果war文件的时间戳比较新,那么解开war文件,再部署该应用。
(3) 部署剩余的war文件。
注:如果在server.xml中,定义了deployOnStartup=false,那么tomcat将不会执行上述的静态部署逻辑。此外,正如2中所说,如果tomcat在部署一个web app的时候,没有找到对应的context配置(Context Descriptor),也就是说,我们没有手动配置context,那么,tomcat会在$CATALINA_HOME/conf/[enginename]/[hostname]目录下自动生成一个。
4. 在tomcat中动态部署一个web应用(不使用Tomcat manager和TCD)。在这种情况下,要想部署一个应用,只有一种做法,那就是利用Tomcat的autoDeploy。在server.xml中,有一个配置项叫Host,前面已经提到了,在Host中可以配置appBase,一样的,autoDeploy也可以配置在这个Host配置项中,如果autoDeploy被设成了true,那么,当以下情况发生时,Tomcat将部署/重部署一个web应用(注:以下文字中的exploded web application指的那些没有被打成war包的web应用,也就是一对文件和目录的那种web应用):
(1) Deployment of .WAR files copied into the Host appBase.
(2) Deployment of exploded web applications which are copied into the Host appBase.
(3) Re-deployment of a web application which has already been deployed from a .WAR when the new .WAR is provided. In this case the exploded web application is removed, and the .WAR is expanded again. Note that the explosion will not occur if the Host is configured so that .WARs are not exploded with a unpackWARs attribute set to "false", in which case the web application will be simply redeployed as a compressed archive.
(4) Re-deployment of a web application if the /WEB-INF/web.xml file (or any other resource defined as a WatchedResource) is updated.
(5) Re-deployment of a web application if the Context Descriptor file from which the web application has been deployed is updated.
(6) Re-deployment of a web application if a Context Descriptor file (with a filename corresponding to the Context path of the previously deployed web application) is added to the $CATALINA_HOME/conf/[enginename]/[hostname]/ directory.
(7) Undeployment of a web application if its document base (docBase) is deleted. Note that on Windows, this assumes that anti-locking features (see Context configuration) are enabled, otherwise it is not possible to delete the resources of a running web application.
很清楚了吧?一旦war文件更新,web.xml更新,Context Descriptor更新,web应用的docBase被删除,等等这类事件都会导致Tomcat部署/重部署一个web应用。不过我想这个autoDeploy设成true之后,会给Tomcat带来一些性能的损失,所以如果在产品应用场合,应该把这个autoDeploy关掉。
注:也可以在server.xml中的loader配置项中配置autoDeploy,此时loader(负责load class)会监控文件的更新情况从而完成部署/重部署。
(1) Deployment of .WAR files copied into the Host appBase.
(2) Deployment of exploded web applications which are copied into the Host appBase.
(3) Re-deployment of a web application which has already been deployed from a .WAR when the new .WAR is provided. In this case the exploded web application is removed, and the .WAR is expanded again. Note that the explosion will not occur if the Host is configured so that .WARs are not exploded with a unpackWARs attribute set to "false", in which case the web application will be simply redeployed as a compressed archive.
(4) Re-deployment of a web application if the /WEB-INF/web.xml file (or any other resource defined as a WatchedResource) is updated.
(5) Re-deployment of a web application if the Context Descriptor file from which the web application has been deployed is updated.
(6) Re-deployment of a web application if a Context Descriptor file (with a filename corresponding to the Context path of the previously deployed web application) is added to the $CATALINA_HOME/conf/[enginename]/[hostname]/ directory.
(7) Undeployment of a web application if its document base (docBase) is deleted. Note that on Windows, this assumes that anti-locking features (see Context configuration) are enabled, otherwise it is not possible to delete the resources of a running web application.
很清楚了吧?一旦war文件更新,web.xml更新,Context Descriptor更新,web应用的docBase被删除,等等这类事件都会导致Tomcat部署/重部署一个web应用。不过我想这个autoDeploy设成true之后,会给Tomcat带来一些性能的损失,所以如果在产品应用场合,应该把这个autoDeploy关掉。
注:也可以在server.xml中的loader配置项中配置autoDeploy,此时loader(负责load class)会监控文件的更新情况从而完成部署/重部署。
有关Tomcat manager部署应用,有一篇单独的文档介绍。而有关TCD的东西,这里就不介绍了。