多模块Maven Spring Boot应用打包后启动即停止且不读取配置
问题分析与修复方案
你的两个问题根源在于Maven打包插件冲突、配置冗余以及子模块打包方式错误,以下是具体修复步骤:
一、核心问题拆解
- 配置文件无法读取:打包过程中配置文件未被正确纳入可执行Jar,或插件冲突导致资源路径异常
- 启动后立即Shutdown:非Web环境或打包后的Jar未正确识别Spring Boot的Web应用类型,或插件配置错误导致应用上下文未保持活跃
二、具体修复步骤
1. 修正父模块pom.xml
移除冲突的打包插件,仅保留必要配置:
- 删除
maven-shade-plugin:Spring Boot Maven插件已内置可执行Jar打包能力,无需额外使用shade插件 - 删除
maven-jar-plugin:父模块为pom打包类型,无需配置Jar插件的mainClass,且该配置会与Spring Boot插件冲突 - 统一Spring Boot插件版本,避免依赖不一致
修改后的父pom.xml关键部分:
<modelVersion>4.0.0</modelVersion> <groupId>com.mysite</groupId> <artifactId>myapp</artifactId> <packaging>pom</packaging> <version>3.0.0-SNAPSHOT</version> <name>myapp</name> <build> <plugins> <!-- 统一配置Spring Boot插件版本,子模块继承 --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.7.8</version> <!-- 仅在启动模块执行repackage --> <executions> <execution> <goals> <goal>repackage</goal> </goals> <configuration> <!-- 默认仅对带有mainClass的模块生效 --> <skip>true</skip> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>17</source> <target>17</target> </configuration> </plugin> </plugins> </build> <!-- properties和dependencies部分保留原内容,modules部分不变 -->
2. 修正gateway模块pom.xml
- 移除手动指定的version,继承父模块版本
- 启用Spring Boot插件的repackage功能,指定mainClass
- 若为网关应用,建议添加
spring-boot-starter-gateway依赖,替换或补充spring-boot-starter-web
修改后的gateway pom.xml:
<modelVersion>4.0.0</modelVersion> <parent> <groupId>com.mysite</groupId> <artifactId>myapp</artifactId> <version>3.0.0-SNAPSHOT</version> </parent> <groupId>com.mysite</groupId> <artifactId>myapp-gateway</artifactId> <name>myapp-gateway</name> <description>myapp Gateway Module</description> <properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>com.mysite</groupId> <artifactId>myapp-service</artifactId> </dependency> <dependency> <groupId>com.mysite</groupId> <artifactId>myapp-util</artifactId> <scope>compile</scope> </dependency> <!-- 网关应用专属依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-gateway</artifactId> <version>2.7.8</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <skip>false</skip> <mainClass>com.mysite.gateway.MyappGatewayApplication</mainClass> </configuration> </plugin> </plugins> </build>
3. 修正service和util模块pom.xml
这两个模块是普通依赖模块,不需要打包成可执行Jar,因此移除spring-boot-maven-plugin,并继承父模块版本:
service模块修改后:
<modelVersion>4.0.0</modelVersion> <parent> <groupId>com.mysite</groupId> <artifactId>myapp</artifactId> <version>3.0.0-SNAPSHOT</version> </parent> <groupId>com.mysite</groupId> <artifactId>myapp-service</artifactId> <name>myapp-service</name> <description>myapp Service Module</description> <properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>com.mysite</groupId> <artifactId>myapp-util</artifactId> <scope>compile</scope> </dependency> </dependencies> <!-- 移除spring-boot-maven-plugin -->
util模块修改后:
<modelVersion>4.0.0</modelVersion> <parent> <groupId>com.mysite</groupId> <artifactId>myapp</artifactId> <version>3.0.0-SNAPSHOT</version> </parent> <groupId>com.mysite</groupId> <artifactId>myapp-util</artifactId> <name>myapp-util</name> <description>myapp Utility Module</description> <properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> <version>5.16.0</version> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.10.1</version> </dependency> </dependencies>
4. 验证配置文件位置
确保gateway模块的application.properties位于src/main/resources目录下,Maven打包时会自动将其纳入Jar的BOOT-INF/classes路径,Spring Boot可正常读取。
5. 重新打包运行
执行以下命令完成打包:
mvn clean package
运行gateway模块的可执行Jar:
java -jar myapp-gateway-3.0.0-SNAPSHOT.jar
内容的提问来源于stack exchange,提问作者Mohammad Hossein Shojaeinia
相关产品推荐
相关产品推荐

