多模块Maven项目(含Spring Boot模块)构建War包技术咨询
多模块Spring Boot项目构建Module-Web War包实操指南
我来帮你搞定这个多模块Spring Boot项目打War包的事儿,一步步来,保证清晰靠谱:
一、先确认父项目POM的基础配置
首先得确保你的无代码父项目pom.xml已经正确挂了Spring Boot的父依赖,并且声明了所有子模块。给你个参考配置:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!-- 挂Spring Boot官方父依赖,统一管理版本 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.15</version> <!-- 换成你实际用的Spring Boot版本 --> <relativePath/> </parent> <groupId>com.yourcompany</groupId> <artifactId>parent-project</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>pom</packaging> <!-- 父项目必须是pom打包类型 --> <!-- 把三个子模块都声明进来 --> <modules> <module>Module-Data</module> <module>Module-Domain</module> <module>Module-Web</module> </modules> <!-- 可选:统一管理子模块的依赖版本,避免每个模块重复写版本号 --> <dependencyManagement> <dependencies> <dependency> <groupId>com.yourcompany</groupId> <artifactId>Module-Data</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>com.yourcompany</groupId> <artifactId>Module-Domain</artifactId> <version>${project.version}</version> </dependency> </dependencies> </dependencyManagement> </project>
二、重点调整Module-Web的配置
要生成可部署的War包,Module-Web的pom和启动类得改三处:
1. 修改打包类型为War
在Module-Web的pom.xml里,把<packaging>改成war:
<packaging>war</packaging>
2. 调整Web依赖,适配外部容器
如果要把War包部署到外部Tomcat/Jetty这类容器,得排除Spring Boot内置的Tomcat,再添上Servlet API的提供依赖(不会被打包进War,避免和容器冲突):
<dependencies> <!-- Web核心依赖,排除内置Tomcat --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <!-- Servlet API,用provided范围,容器会提供 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> <!-- 引入其他两个子模块的依赖 --> <dependency> <groupId>com.yourcompany</groupId> <artifactId>Module-Domain</artifactId> </dependency> <dependency> <groupId>com.yourcompany</groupId> <artifactId>Module-Data</artifactId> </dependency> </dependencies>
要是你想让War包既能部署到外部容器,又能直接用java -jar运行,那可以不用排除内置Tomcat,上面的配置改成保留Tomcat就行,不影响War包生成。
3. 修改启动类,让外部容器能识别
Module-Web的启动类得继承SpringBootServletInitializer,并重写configure方法,这样外部容器启动时才能正确初始化Spring Boot应用:
package com.yourcompany.moduleweb; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; @SpringBootApplication(scanBasePackages = "com.yourcompany") // 这里要扫到所有模块的包哦 public class ModuleWebApplication extends SpringBootServletInitializer { // 保留原有的main方法,方便本地运行测试 public static void main(String[] args) { SpringApplication.run(ModuleWebApplication.class, args); } @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(ModuleWebApplication.class); } }
三、执行构建命令生成War包
回到父项目的根目录,打开终端执行下面的Maven命令:
mvn clean package -DskipTests
等构建完成,War包就会出现在Module-Web/target目录下,名字大概是Module-Web-1.0.0-SNAPSHOT.war(取决于你设置的版本号)。
四、验证War包是否可用
- 直接运行测试:如果没排除内置Tomcat,直接用这个命令就能启动:
java -jar Module-Web-1.0.0-SNAPSHOT.war - 部署到外部容器:把War包复制到Tomcat的
webapps目录,启动Tomcat,它会自动解压部署,之后就能通过容器的端口访问你的应用了。
内容的提问来源于stack exchange,提问作者Mario Dennis




