如何在IntelliJ IDEA中为Spring Boot项目构建可正确读取配置的jar包
问题根因定位
- 配置文件未被正确打包进jar包的classpath:IntelliJ IDEA运行项目时会默认将项目的资源目录加入运行时classpath,但若资源目录未被正确标记、或打包配置中排除了properties文件,构建的jar包就会缺失配置文件,Spring Boot找不到指定配置就会使用默认的8080端口。
- 未使用Spring Boot官方打包插件:使用普通Java打包插件构建的jar包不会整合依赖、也不会按Spring Boot的目录结构打包资源,会导致配置和依赖加载失败。
- 运行时配置被覆盖:启动jar包时传入的命令行参数、系统环境变量可能覆盖了配置文件中指定的激活环境和端口配置。
解决步骤
1. 确认资源目录配置
打开IntelliJ IDEA的File -> Project Structure -> Modules -> 对应项目模块 -> Sources,检查src/main/resources目录是否被标记为Resources Root,如果没有则右键该目录,选择Resources完成标记。
2. 确认打包配置包含资源文件
Maven项目(pom.xml)
检查build节点的resources配置,确保没有排除properties文件:
<build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.json</include> <!-- 适配你的firebase配置文件 --> </includes> </resource> </resources> </build>
Gradle项目(build.gradle)
检查是否有排除resources目录的配置,Spring Initializr默认生成的配置会自动包含资源文件,若自行添加了exclude规则匹配properties文件需要删除。
3. 配置Spring Boot官方打包插件
Maven项目(pom.xml)
添加spring-boot-maven-plugin插件,确保打包后的jar是可执行的Spring Boot结构:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>对应你的Spring Boot版本号</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
Gradle项目(build.gradle)
引入Spring Boot插件:
plugins { id 'org.springframework.boot' version '对应你的Spring Boot版本号' id 'io.spring.dependency-management' version '1.1.0' id 'java' }
4. 执行打包命令
不要使用IDEA自带的Build Artifact功能,使用官方构建命令:
- Maven项目:在项目根目录执行
mvn clean package,打包完成后jar包生成在target目录下 - Gradle项目:在项目根目录执行
gradle clean bootJar,打包完成后jar包生成在build/libs目录下
5. 验证打包结果和运行
打包完成后可以执行命令检查配置文件是否在jar包内:jar tf 你的jar包名称.jar | grep properties,输出中能看到application.properties、application-dev.properties、application-prod.properties三个文件即为打包正常。
运行jar包时可以通过命令显式指定激活环境,避免配置被覆盖:
- 运行生产环境:
java -jar 你的jar包名称.jar --spring.profiles.active=prod - 运行开发环境:
java -jar 你的jar包名称.jar --spring.profiles.active=dev
启动时查看日志,会打印The following 1 profile is active: "xxx"以及启动端口,确认配置生效。
内容的提问来源于stack exchange,提问作者Alex Kamanin
相关产品推荐
相关产品推荐

