Spring Boot多模块项目:用Maven构建可执行单Jar包及示例POM
Spring Boot多模块项目构建可执行单Jar包方案
Spring Boot的可执行Jar有特殊目录结构,Maven Assembly插件无法正确适配这种结构,推荐使用官方的spring-boot-maven-plugin实现多模块项目的单可执行Jar打包。以下是完整的POM示例:
项目结构
my-spring-boot-app/ ├── pom.xml (父项目) ├── app-core/ │ └── pom.xml └── app-web/ └── pom.xml
父项目POM (my-spring-boot-app/pom.xml)
<?xml version="1.0" encoding="UTF-8"?> <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> <groupId>com.example</groupId> <artifactId>my-spring-boot-app</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>pom</packaging> <name>My Spring Boot App (Parent)</name> <description>Parent project for multi-module Spring Boot application</description> <modules> <module>app-core</module> <module>app-web</module> </modules> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.2.0</version> <relativePath/> </parent> <properties> <java.version>17</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>com.example</groupId> <artifactId>app-core</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> </dependencyManagement> </project>
核心模块POM (my-spring-boot-app/app-core/pom.xml)
该模块为普通Jar模块,存放业务逻辑、工具类等:
<?xml version="1.0" encoding="UTF-8"?> <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"> <parent> <groupId>com.example</groupId> <artifactId>my-spring-boot-app</artifactId> <version>1.0.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>app-core</artifactId> <name>App Core Module</name> <description>Core business logic module</description> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> </dependencies> </project>
Web模块POM (my-spring-boot-app/app-web/pom.xml)
该模块作为Spring Boot启动模块,负责打包成可执行Jar,依赖核心模块:
<?xml version="1.0" encoding="UTF-8"?> <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"> <parent> <groupId>com.example</groupId> <artifactId>my-spring-boot-app</artifactId> <version>1.0.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>app-web</artifactId> <name>App Web Module</name> <description>Web entry module with executable Jar</description> <packaging>jar</packaging> <dependencies> <dependency> <groupId>com.example</groupId> <artifactId>app-core</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <mainClass>com.example.appweb.Application</mainClass> </configuration> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
打包与运行
- 在父项目根目录执行打包命令:
mvn clean package - 打包完成后,可执行Jar位于
app-web/target目录下,文件名类似app-web-1.0.0-SNAPSHOT.jar - 运行Jar包:
java -jar app-web/target/app-web-1.0.0-SNAPSHOT.jar
关键说明
spring-boot-maven-plugin的repackage目标会自动将所有依赖(包括子模块的类文件)打包到可执行Jar中,同时维护Spring Boot所需的目录结构- 仅启动模块(此处为
app-web)需要配置该插件,其他模块只需作为普通Jar被依赖即可
内容的提问来源于stack exchange,提问作者kmanish
相关产品推荐
相关产品推荐

