由David发表在天码营
Web应用在Servlet容器中以WAR(Web Application Archive)文件格式作为部署单元。它将JSP、Servlet class、Java class、XML配置文件、静态Web资源(HTML、CSS、JavaScript、Images等等)作为整体打包为一个独立的Web应用。
我们使用Eclipse IDE开发Java Web应用,它的源代码目录结构包含src
, WebContent
等目录——这属于应用的代码结构,它与最终的WAR文件格式仍然存在一定的区别,例如Java源代码文件需要被编译为字节码文件,在WAR文件结构中,src
,WebContent
等用于区分源码、Web内容的目录页不复存在。
一个WAR文件实际上和传统的JAR文件是非常类似的,但它特有之处在于存在一个WEB-INF
目录,该目录中包含一个web.xml
文件用来描述整个Web应用结构(例如定义Servlet和URL之间的映射关系,当然如果在Servlet 3.0后使用注解可以不在web.xml里描述这部分内容)。所有符合Java EE标准的应用服务器(或Servlet容器)都支持通过WAR文件格式部署应用。
app.war
|--WEB-INF/
|--lib/
|--classes/
|--images/
|--css/
|--js/
|--templates
可以看到Servlet容器会将根目录下除WEB-INF/
目录以为的内容发布,例如可以直接通过访问URL/images/
访问images
目录下的内容,这一部分内容包括JSP文件以及Web静态资源,所以在开发过程中我们通常会将这些内容与Java源文件区分开来(放在WebContent
目录下)。
WEB-INF
目录则相对特殊,除了包含Web应用描述符web.xml
,还包含Java源代码编译后得到的字节码文件(.class
,放在classes
目录中)以及依赖的第三方库(.jar,放在lib
目录中)。
只要符合标准的WAR文件都可以被应用服务器接受并部署运行,那么即时不通过IDE,我们只需要将源代码目录中的Java源代码编译为字节码文件,同时将第三方依赖以及Web静态资源放置在合适的位置,就可以组合为一个WAR文件。
在使用IDE的开发的过程中,可能部署到应用服务器的方式非常简单,以Eclipse IDE为例,修改源代码并保存文件后,通过Eclipse内置的WTP插件进行几次简单的鼠标点击就可以将一个项目(Dynamic Project)部署到Tomcat应用服务器并运行。实际上插件做的事情就是在上一小节中描述的Web应用部署过程。只不过我们修改完源代码后,这一切都自动构建完成,同时还添加了热部署功能更加方便我们开发调试:
Eclipse插件并不会将编译后的文件目录直接复制到Tomcat安装目录,而是使用当前工作空间中的目录,具体位置是${WORKSPACE_PATH}/metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/
。该目录下的每一个文件夹,都是一个Web应用的部署结构,大家可以通过查看该目录下的文件内容变化来印证本节课中的知识点。
既然有了IDE能够如此方便的操作Tomcat,为什么还要去深入了解Web应用内部的部署细节机制呢?首先作为图形界面的IDE,在真正的生产环境中是不存在的,必须了解WAR文件的打包方式才能够真正将应用发布在Internet上;其次在开发过程中,仍然可能出现很多和部署相关的问题,深入了解底层机制后有利于更快速的发现问题、解决问题。
自己动手来得到一个WAR文件是一件繁琐且重复的事情,既然它是可重复的那我们就要想办法借助工具对打包过程进行自动化。既然Eclipse本身能够很好地完成部署工作,它自己内部一定已经实现了这套自动化的机制——没错,Eclipse对于Dynamic Web工程的打包方式默认采用的是Ant构建工具,只不过相关的自动化构建脚本被隐藏在了图形界面之下。
在Eclipse中导出当前Web应用的WAR文件进行部署也非常简单:
Project Explorer
(或Package Explorer
)视图中右键点击Web工程,选中弹出菜单中的Export...
Web/WAR file
,选中它并选择Next
Destination
中选择导出WAR文件的位置,点击Finish
按钮后,WAR文件就会被导出至相应位置