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