You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Maven多模块Spring Boot项目中共享application.properties

优雅解决多模块Spring Boot项目公共配置共享的方案

这个问题我之前维护多模块Spring Boot项目时也碰到过,结合你部署在外部Tomcat的场景,给你分享几个实用且优雅的解决方案:

方案一:利用Spring Boot Profile机制共享配置

这是最轻量化的方案,适合大多数中小项目:

  1. 在父项目的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
  1. 在每个子模块(service1、service2、service3)的application.properties中,通过spring.profiles.include引入公共配置:
# 引入公共配置
spring.profiles.include=common
# 子模块自身专属配置
server.port=8081
spring.application.name=service1
  1. 确保父项目的pom.xml配置了资源打包,让子模块能继承到公共配置文件:
<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>*.properties</include>
            </includes>
        </resource>
    </resources>
</build>

这种方式的好处是配置集中管理,子模块按需引入,而且Spring Boot会自动处理配置优先级——子模块的专属配置会覆盖公共配置中的相同项。

方案二:外部化配置(适配外部Tomcat部署场景)

如果所有服务都部署在同一个外部Tomcat上,把公共配置放在Tomcat层面统一管理会更高效:

  1. 在Tomcat的conf目录下创建公共配置文件,比如common-spring.properties,写入公共配置内容。

  2. 修改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资源过滤与变量替换

适合那些需要在构建阶段确定的公共配置(比如数据库地址、版本号等):

  1. 在父项目的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>
  1. 在每个子模块的pom.xml中开启资源过滤,让Maven打包时替换配置文件中的变量:
<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <!-- 开启变量过滤 -->
            <filtering>true</filtering>
        </resource>
    </resources>
</build>
  1. 在子模块的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:21:19