WAR文件
3.2 WAR文件
如果一个Web应用程序的目录和文件非常多,那么将这个Web应用程序部署到另一台机器上,就不是很方便了,我们可以将Web应用程序打包成Web归档(WAR)文件,这个过程和把Java类文件打包成JAR文件的过程类似。利用WAR文件,可以把Servlet类文件和相关的资源集中在一起进行发布。在这个过程中,Web应用程序就不是按照目录层次结构来进行部署了,而是把WAR文件作为部署单元来使用。
一个WAR文件就是一个Web应用程序,建立WAR文件,就是把整个Web应用程序(不包括Web应用程序层次结构的根目录)压缩起来,指定一个.war扩展名。下面我们将第2章的Web应用程序打包成WAR文件,然后发布。WAR文件的创建与JAR文件的创建使用相同的命令。
打开命令提示符,进入%CATALINA_HOME%\webapps\ch02\目录,执行下面的命令:
jar -cvf ch02.war *
这个命令将ch02目录下所有的子目录和文件都打包成一个名为ch02.war的归档文件。如果不想包含src目录及其下的Java源文件(在发布时不应该把Java源文件包含到WAR文件中),可以执行下面的命令:
jar -cvf ch02.war *.html WEB-INF/
要查看WAR文件的内容,可以执行下面的命令:jar -tf ch02.war
这个命令将列出WAR文件的内容,或者用WinRAR工具软件查看ch02.war文件的内容,如图3-2所示。
如果修改了某个Servlet类文件,需要替换WAR文件中的旧文件,可以执行下面的命令:
jar -uf ch02.war WEB-INF/classes/org/
sunxin/ch02/servlet/LoginServlet. class
当然你也可以利用WinRAR软件来更新压缩包中的文件。
如果我们将ch02.war文件放到%CATALINA_HOME%\webapps目录下,在Tomcat启动时,会自动解压这个WAR文件,按照打包前的目录层次结构生成与WAR文件的文件名同名的目录ch02及下面的子目录和文件。读者可以自己动手做一下实验,先删除在%CATALINA_HOME%\webapps目录下的ch02目录,然后将ch02.war文件复制到%CATALINA_HOME%\webapps目录下,启动Tomcat,你会看到在webapps目录下新产生了一个ch02目录。
当然,我们也可以直接从WAR文件运行Web应用程序,打开%CATALINA_ HOME%\conf\server. xml文件,找到<Host>元素的配置处,如下所示:
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
…
将unpackWARs属性的值设置为false,这样,Tomcat将直接运行WAR文件。关于<Host>元素各属性的含义,请参看附录C或Tomcat的文档。
删除Tomcat产生的目录ch02,重新启动Tomcat,查看%CATALINA_HOME%\webapps目录,可以看到这次没有产生ch02目录,打开浏览器,输入以前访问过的URL进行测试。
在建立WAR文件之前,需要建立正确的Web应用程序的目录层次结构。
建立WEB-INF子目录,并在该目录下建立classes与lib两个子目录。
将Servlet类文件放到WEB-INF\classes目录下,将Web应用程序所使用Java类库文件(即JAR文件)放到WEB-INF\lib目录下。
建立web.xml文件,放到WEB-INF目录下。
根据Web应用程序的需求,将JSP页面或静态HTML页面放到上下文根路径下或其子目录下。
如果有需要,建立META-INF目录,并在该目录下建立context.xml文件。
只有在确保这些工作后都完成后,才开始建立WAR文件。
要注意的是,虽然WAR文件和JAR文件的文件格式是一样的,并且都是使用jar命令来创建,但就其应用来说,WAR文件和JAR文件是有根本区别的。JAR文件的目的是把类和相关的资源封装到压缩的归档文件中,而对于WAR文件来说,一个WAR文件代表了一个Web应用程序,它可以包含Servlet、HTML页面、Java类、图像文件,以及组成Web应用程序的其他资源,而不仅仅是类的归档文件。
我们什么时候应该使用WAR文件呢?在开发阶段不适合使用WAR文件,因为在开发阶段,经常需要添加或删除Web应用程序的内容,更新Servlet类文件,而每一次改动后,重新建立WAR文件将是一件浪费时间的事情。在产品发布阶段,使用WAR文件是比较合适的,因为在这个时候,几乎不需要再做什么改动了。
在开发阶段,我们通常将Servlet源文件放到Web应用程序目录的src子目录下,以便和Web资源文件区分。在建立WAR文件时,只需要将src目录从Web应用程序目录中移走,就可以打包了。