在Java开发中,Maven作为项目管理工具,提供了强大的构建功能,其中将项目打包成WAR文件是Web应用部署的关键步骤,WAR(Web Application Archive)是一种用于存储Web组件的归档格式,包含Servlet、JSP、HTML、JavaScript、CSS以及依赖库等资源,使用Maven打WAR包的核心在于配置pom.xml文件并执行构建命令,以下是详细操作流程和注意事项。

Maven打WAR包的基础配置
在pom.xml中,需明确指定项目打包类型为war,通过<packaging>标签实现,默认情况下Maven项目可能使用jar打包,因此需手动修改为war。
<packaging>war</packaging>
若项目包含Servlet依赖,需确保在dependencies中添加Servlet API依赖,避免因版本冲突导致编译或运行时错误。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
注意scope为provided,表示该依赖由容器(如Tomcat)提供,避免重复打包。
执行Maven打WAR包命令
Maven提供了多种命令用于构建项目,核心命令为mvn package,以下是常用命令及其说明:

| 命令 | 功能说明 | 示例 |
|---|---|---|
mvn clean package |
清理之前的构建结果,重新编译并打包 | mvn clean package |
mvn clean install |
清理、打包并安装到本地仓库 | mvn clean install |
mvn clean deploy |
清理、打包并部署到远程仓库 | mvn clean deploy |
执行mvn clean package后,Maven会按以下流程处理:
- 清理(clean):删除
target目录下的旧文件,确保构建环境干净。 - 编译(compile):将
src/main/java下的Java源文件编译为.class文件,存放在target/classes。 - 资源处理(resources):复制
src/main/resources下的资源文件到target/classes。 - 打包(package):将
target/classes及依赖的第三方库(位于target/项目名/WEB-INF/lib)打包为WAR文件,默认生成在target目录下,文件名格式为项目名-版本号.war。
高级配置与常见问题处理
-
排除WEB-INF/lib中的依赖
若希望某些依赖不打包到WAR的WEB-INF/lib中,可通过<scope>或<exclusions>配置。<dependency> <groupId>com.example</groupId> <artifactId>example-lib</artifactId> <version>1.0.0</version> <scope>provided</scope> </dependency> -
自定义WAR文件名
通过<build>标签中的<finalName>指定输出文件名,避免版本号干扰:<build> <finalName>mywebapp</finalName> </build> -
处理多模块项目
在多模块Maven项目中,若某个子模块需打WAR包,需确保父模块的<packaging>为pom,子模块单独配置war类型,并通过<modules>管理依赖关系。
(图片来源网络,侵删) -
跳过测试打包
若需跳过单元测试以提高构建速度,可添加参数-DskipTests:mvn clean package -DskipTests
验证WAR包结构
打包完成后,可通过解压WAR文件检查目录结构是否符合Web应用规范,典型结构如下:
mywebapp.war
├── META-INF/
│ └── MANIFEST.MF
├── WEB-INF/
│ ├── classes/ # 编译后的.class文件及资源
│ ├── lib/ # 第三方依赖JAR
│ └── web.xml # 部署描述符(Servlet 3.0+可省略)
├── index.html # 静态资源
└── static/ # 静态资源目录
相关问答FAQs
Q1: 为什么执行mvn package后WAR包中缺少依赖库?
A: 可能原因有两个:一是依赖的scope配置错误(如误设为provided导致未打包),二是未在pom.xml中正确传递依赖,可通过检查依赖的scope或使用mvn dependency:tree命令分析依赖树,确认是否被排除,确保<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId></plugin></plugins></build>中未配置<packagingExcludes>排除依赖库。
Q2: 如何在打包时排除特定文件或目录?
A: 可使用maven-war-plugin的<packagingExcludes>或<webResources>配置,排除src/main/webapp/ignore目录:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.2</version>
<configuration>
<packagingExcludes>src/main/webapp/ignore/**</packagingExcludes>
</configuration>
</plugin>
</plugins>
</build> 