12.1 Web项目的目录结构

我们都知道,基于Java的Web应用,其标准的打包方式是WAR。WAR与JAR类似,只不过它可以包含更多的内容,如JSP文件、Servlet、Java类、web.xml配置文件、依赖JAR包、静态web资源(如HTML、CSS、JavaScript文件)等。一个典型的WAR文件会有如下目录结构:


-war/

+META-INF/

+WEB-INF/

| +classes/

| | +ServletA.class

| | +config.properties

| | +……

| |

| +lib/

| | +dom4j-1.4.1.jar

| | +mail-1.4.1.jar

| | +……

| |

| +web.xml

|

+img/

|

+css/

|

+js/

|

+index.html

+sample.jsp


一个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


<project>

……

<groupId>com.juvenxu.mvnbook</groupId>

<artifactId>sample-war</artifactId>

<packaging>war</packaging>

<version>1.0-SNAPSHOT</version>

……

</project>


如果不显式地指定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目录结构如下:


+project

|

+pom.xml

|

+src/

+main/

| +java/

| | +ServletA.java

| | +……

| |

| +resources/

| | +config.properties

| | +……

| |

| +webapp/

| +WEB-INF/

| | +web.xml

| |

| +img/

| |

| +css/

| |

| +js/

| +

| +index.html

| +sample.jsp

|

+test/

+java/

+resources/


在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文件。