如何在Maven多模块Spring Boot项目中共享application.properties
这个问题我之前维护多模块Spring Boot项目时也碰到过,结合你部署在外部Tomcat的场景,给你分享几个实用且优雅的解决方案:
方案一:利用Spring Boot Profile机制共享配置
这是最轻量化的方案,适合大多数中小项目:
- 在父项目的
src/main/resources目录下创建公共配置文件,比如application-common.properties,把所有服务共用的配置放进去:
# 公共数据库配置 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.jpa.hibernate.ddl-auto=update # 公共日志配置 logging.level.root=INFO logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
- 在每个子模块(service1、service2、service3)的
application.properties中,通过spring.profiles.include引入公共配置:
# 引入公共配置 spring.profiles.include=common # 子模块自身专属配置 server.port=8081 spring.application.name=service1
- 确保父项目的
pom.xml配置了资源打包,让子模块能继承到公共配置文件:
<build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>*.properties</include> </includes> </resource> </resources> </build>
这种方式的好处是配置集中管理,子模块按需引入,而且Spring Boot会自动处理配置优先级——子模块的专属配置会覆盖公共配置中的相同项。
方案二:外部化配置(适配外部Tomcat部署场景)
如果所有服务都部署在同一个外部Tomcat上,把公共配置放在Tomcat层面统一管理会更高效:
在Tomcat的
conf目录下创建公共配置文件,比如common-spring.properties,写入公共配置内容。修改Tomcat的启动脚本(Linux下是
bin/catalina.sh,Windows下是bin/catalina.bat),添加JVM参数指定额外的配置位置:
# Linux 示例 CATALINA_OPTS="$CATALINA_OPTS -Dspring.config.additional-location=file:${CATALINA_BASE}/conf/common-spring.properties"
这样所有部署在这个Tomcat上的Spring Boot应用,启动时都会自动加载这个外部公共配置。同样,子模块自身的application.properties配置优先级更高,会覆盖公共配置中的重复项。
方案三:Maven资源过滤与变量替换
适合那些需要在构建阶段确定的公共配置(比如数据库地址、版本号等):
- 在父项目的
pom.xml中定义公共配置变量:
<properties> <common.db.url>jdbc:mysql://localhost:3306/shared_db</common.db.url> <common.db.username>db_user</common.db.username> <common.db.password>db_pass</common.db.password> </properties>
- 在每个子模块的
pom.xml中开启资源过滤,让Maven打包时替换配置文件中的变量:
<build> <resources> <resource> <directory>src/main/resources</directory> <!-- 开启变量过滤 --> <filtering>true</filtering> </resource> </resources> </build>
- 在子模块的
application.properties中引用父模块定义的变量:
spring.datasource.url=${common.db.url} spring.datasource.username=${common.db.username} spring.datasource.password=${common.db.password}
Maven打包时会自动把这些变量替换成实际的配置值,实现公共配置的统一管理。
方案四:Spring Cloud Config(微服务场景)
如果你的项目是微服务架构,且需要动态刷新配置,那么Spring Cloud Config是更专业的选择:
搭建一个Config Server,将所有公共配置存储在Git仓库中,每个子服务启动时从Config Server拉取配置。这种方式不仅能实现公共配置共享,还支持配置的版本管理、动态刷新,适合大规模微服务集群。不过这个方案相对重一些,小项目可能没必要。
注意事项
- 配置优先级:Spring Boot的配置加载顺序是「内部application.properties」<「外部附加配置」<「命令行参数」,所以子模块的专属配置会覆盖公共配置中的相同项,不用担心冲突。
- 敏感配置:如果有数据库密码这类敏感信息,建议结合Jasypt进行加密,避免明文存储。
内容的提问来源于stack exchange,提问作者yk42b

