我们都知道,基于Java的Web应用,其标准的打包方式是WAR。WAR与JAR类似,只不过它可以包含更多的内容,如JSP文件、Servlet、Java类、web.xml配置文件、依赖JAR包、静态web资源(如HTML、CSS、JavaScript文件)等。一个典型的WAR文件会有如下目录结构:
一个WAR包下至少包含两个子目录:META-INF和WEB-INF。前者包含了一些打包元数据信息,我们一般不去关心;后者是WAR包的核心,WEB-INF下必须包含一个Web资源表述文件web.xml,它的子目录classes包含所有该Web项目的类,而另一个子目录lib则包含所有该Web项目的依赖JAR包,classes和lib目录都会在运行的时候被加入到Classpath中。除了META-INF和WEB-INF外,一般的WAR包都会包含很多Web资源,例如你往往可以在WAR包的根目录下看到很多html或者jsp文件。此外,还能看到一些文件夹如img、css和js,它们会包含对应的文件供页面使用。
同任何其他Maven项目一样,Maven对Web项目的布局结构也有一个通用的约定。不过首先要记住的是,用户必须为Web项目显式指定打包方式为war,如代码清单12-1所示。
代码清单12-1 显式指定Web项目的打包方式为war
如果不显式地指定packaging,Maven会使用默认的jar打包方式,从而导致无法正确打包Web项目。
Web项目的类及资源文件同一般JAR项目一样,默认位置都是src/main/java/和src/main/resources,测试类及测试资源文件的默认位置是src/test/java/和src/test/resources/。Web项目比较特殊的地方在于:它还有一个Web资源目录,其默认位置是src/main/webapp/。一个典型的Web项目的Maven目录结构如下:
在src/main/webapp/目录下,必须包含一个子目录WEB-INF,该子目录还必须要包含web.xml文件。src/main/webapp目录下的其他文件和目录包括html、jsp、css、JavaScript等,它们与WAR包中的Web资源完全一致。
在使用Maven创建Web项目之前,必须首先理解这种Maven项目结构和WAR包结构的对应关系。有一点需要注意的是,WAR包中有一个lib目录包含所有依赖JAR包,但Maven项目结构中没有这样一个目录,这是因为依赖都配置在POM中,Maven在用WAR方式打包的时候会根据POM的配置从本地仓库复制相应的JAR文件。