Tomcat教程

部署WAR文件

将Web应用程序部署到Tomcat中的另一主要方法是把应用程序部署到一个打包的WAR文件中Java Servlet规范含有WAR文件的评细描述。

在部署WAR文件时,对Tomcat而言,您必须决定是在WAR打包之后还是仍然在打包到 WAR文件中服务于Web应用程序。这两种形式都支持。默认情况下,当Tomcat部署WAR文件时,Tomcat要做的第一件事情是解包WAR文件的内容到相同文件名的路径中,去除.war扩展名,然后从解包的目录中服务文件。

例如,如果您的WAR文件叫做suitcase.war,那么Tomcat将解包suitcase.war内容到叫做suitcase的目录中,然后将从磁盘的suitcase目录中读取充当部分Web应用程 序的文件,而不是从WAR文件中读取。您也可以设置文件中的Host元素的unpackWARs="false"以关闭解包行为。将unpackWARs设置为false,Tomcat将刚好从打包的WAR文件自身提供Web应用程序的文件。

在第一次将Web应用程序部署为WAR文件时,有两种配置Tomcat辨认井启动应用的方法:

1.server.xml context部署:在server.xml文件中增加一个<Context>元素并重启 Tomcat。
2.Context XML片段文件部署:在Tomcat的CATALINA_HOME/conf/[EngineName]/[HostName]目录树中增加一个新的context XML片段文件,或者创建一个与Web应 用程序根目录相关的Web应用程序的WEB-INF/context.xml文件,然后重启Tomcat。

对给定的Web应用程序,您只能选择这两种部署配置方法之一。

server.xml Context部署

可以编辑文件和配置Tomcat以辨认、启动和管理Web应用程序。再次,这是笔者建议您为每个新增加的Web应用程序配置Tomcat的方法。

要使用这一部署方法部署WAR文件,必须在server.xml中为Web应用程序增加Context元 素,且必须把Web应用程序的Context元素嵌套在Host容器元素中。

编辑server.xml文件,并查找Host元素,默认情况如下所示:

<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true" 
xmlValidation="false" xmlNamespaceAware="false">

...

</Host>

可以设置unpackWARs的值为true或false,这要根据从打包的WAR文件还是在第一次解包后从解包的目录提供文件而定。笔者建议您设置该值为true,并允许Tomcat解包WAR文件且从解包目录下提供文件,因为这样处理可以使您很容易就能检测到Tomcat提供什么 样的Web应用程序文件和内容。

通常,因为默认情况下主机名是localhost,而且通过Tomcat的网络服务器传递给机器的请求都将默认主机作为(默认)路由,所以在默认Host中增加Context能工作。 在Host中增加Context的情况如下所示:

<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="false" 
xmlValidation="false" xmlNamespaceAware="false">

<Context docBase="my-webapp.war" path="/my-webapp"/>

</Host>

保存server.xml并重启Tomcat。当Tomcat启动的时候,它将查找路径CATALINA_HOME/webapps/my-webapp.war中Web应用程序的WAR文件。如果Tomcat在该路径下找到了您的Web应用程序,Tomcat将尝试部署您的Web应用程序,而且将它安装到URI路径为/my-webapp的Web服务器上。如果在启动和停止Web应用程序时,Tomcat没有遇到任何错误(査看日期),您就可以通过浏览http://localhost:8080/my-webapp进行访问。

相反,如果您想让这个特殊的Web应用程序映射为服务器的根URI(“/”),如通过http://localhost:8080/my-webapp访问您的Web应用程序,您需要执行下列特殊步骤:

1.停止Tomcat。
2.确定不存在CATALINA_HOME/conf/[EngitteName]/[Hostname]/ROOT.xml配置文件, 如果存在,只要删除就可以了。
3.编辑server.xml文件,并使<Host>和<Context>其看起来如下所示:

<Host name="localhost" appBase="webapps" 
    unpackWARs="true" autoDeploy="false"
 xmlValidation="false" xmlNamespaceAwar="false">
<Context docBase="my-webapp.war" path=""/>
<Host>

注意在Context元素上path="",这让Tomcat把您的Web应用程序映射为root URI路径。在这种情况下,没有其他程序被映射为root URI路径,而且您的Web应用程序已经被显示映射为root URI路径。请再次确定autoDeploy被设置为false,否则,您的Web应用程序将被部署两次(一次在root URI上被文件显式配置的路径所部署,另一次在/my-webapp URI路径下被自动部署)。

重启Tomcat,一旦完成启动,请浏览http://localhost:8080,就会看到自己的Web应用程序。


Context XML片段部署

Context条目也能以context XML片段文件的方式呈现。Context XML片段文件并不是完整的server.xml文件,而只是适合于Web应用程序的Context元素及任何子元素,就像 server.xml中配置的那样,除了在Context元素驻留于context XML片断文件中的时候无法指定路径属性之外。

Context XML片段文件可以驻留在CATALINA_HOME/conf/[EngineName]/[HostName]目录树中,也可以驻留在Web应用程序的WEB-INF/目录中。当context XML片段文件中的Context元素被配置为驻留于CATALINA_HOME/conf/[EngineName]/[HostName]目录树中时,Tomcat读取该context XML片段文件的文件名,并将该文件名用作Web应用程序的 Web服务器URI路径,就像路径属性被设置为该文件名一样(减去".xmr"扩展)。例 如,如果contcxt XML片段文件被命名为my-webapp.xml,在Tomcat部署和启动该Web应 用程序时,它将通过URL http://localhost:8080/my-webapp进行访问。

Server.xml文件中没有列出该示例,而是通过存储于CATALINA_HOME/conf/Catalina/localhost/admin.xml的context XML元素显式配置而得到:

<!--
					
		Tomcat管理Web应用程序的Context配置文件
$Id: tomcat_implement_3_3_deployWAR.html,v 1.1 2015/10/21 09:57:09 wnq Exp $

-->

<Context docBase="${catalina.home}/server/webapps/admin" privileged="true" 
antiResourceLocking="false" antiJARLocking="false">
<!--出于明显的安全防护因素,取消下列Valve的注释,以限制访问localhost上的Admin应用程序。这里可以增加以逗号分割的主机列表(甚至是常规的表达式)。
<Valve className="org.apache.catalina.valves.RemoteAddrValve" 
allow="127.0.0.1"/>
-->

</Context>

如果您试图通过context XML片段文件配置Tomcat的根Web应用程序(这祥的应用程序可以通过URI http://localhost:8080进行访问),那么您还需要掌握一个特殊的规则。 根URI应该以"/"或""(空的context路径)表示,这不会映射到文件名,而Tomcat把它当作一个特例。如果通过CATALINA_HOME/conf/[EngineName]/[HostName]/中的 context XML片段文件部署,那么Tomcat将把该context映射为根URI。如果使用META-INF/context.xml在根URI上部署Web应用程序,则您需要将Web应用程序目录命名为 “ROOT”。

作为另一个例子,在本地文件系统上/opt/webapps/my-webapp路径下,如果笔者想部署驻留的叫做my-webapp的Web应用程序目录,连同配置访问该Web应用程序部分网页的身份认证,那么可以使用下列context XML片段文件:

<!--
用Context XML片段文件部署my-webapp.
-->						
<Context docBase="/opt/webapps/my-webapp.war">
	
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" 
       resourceName="UserDatabase" />
</Context>

以"my-webapp.xml" 命名该context XML片段文件,并把它放在CATALINA_HOME/conf/Catalina/localhost/目录中,重启Tomcat,而且Tomcat应能找到该文件,而您的Web应用程序应得到了部署。

注意在这些例子中,笔者提供了Context XML配置元素,您可以指定context的XML片段文件中所需的所有Context值。在前面的例子中,笔者还给您展示了一个Realm配置,以使用Tomcat的UserDatabaseRealm 鉴别存储于CATALINA_HOME/conf/tomcat-users.xml文件中的用户和角色。这一示例示范了在context XML片段文件的Context元素中嵌套相同的配置元素是完全可行的,就像要配置Tomcat的文件中的Context一样。

如果您希望把context XML片段文件放在Web应用程序本身中,那么您需将它放在路径META-INF/context.xml。这一文件名不可更改,因为Tomcat只会寻找具有 这样的文件名的context XML片段文件。这样处理的不利之处在于,您无法在META-INF/context.xml中设置Context的路进属性,加上您还不能更改文件名,所以您没有改 变URI路径为Tomcat映射Web应用程序路径的方法——而该文件名就是Web应用程序的解包目录。如果您可以接受这一处理方式,那么使用这一配置文件的好处在于,也驻留于Web应用程序中,而且不是必须安装的独立文件。因为Tomcat要读取和使用META-INF/context.xml文件,所以您一定不要设置主机上的deployXML=“false”。默认情况下,deployXML被设置为true,因此,如果您没有显式设置它,则Tomcat将使用context.xml文件中存在的值。

在决定使用这一部署方法之前,记住Tomcat开发者选择提供context XML片段文件这一特性的初衷之一在于,可以用区别于server.xml的配置文件配置Web应用程序,从而不需如此频繁地修改server.xml。这样处理的主要思想在于将Web应用程序配置模块与 Tomcat配置文件的其他部分分开但是,通常Web应用程序需要更多的配置,而不仅是Context元素及该元素包含的内容。Web应用程序通常还需要定制Connect配置、定制 Host配置(至少是经常发生变化的一些部署属性,但有时还需要改变Host名,大概需要改变Engine的默认主机名)、定制GlobalNamingResources配置等。这些内容都超出了Context元素的范围,而且不能在context XML片段文件中进行设定,这意味着您还不得不修改server.xml,以配置公共Web应用程序指定的项目,因此,Web应用程序的配罝信息通常不能彻底与server.xml中的其余Tomcat配置参数分开。

关注微信获取最新动态