IDEA + Maven 实战:如何优雅地切换 Dev 和 Prod 环境进行打包?


IDEA + Maven 实战:如何优雅地切换 Dev 和 Prod 环境进行打包?

在日常开发中,我们经常面临一个痛点:**本地开发(Dev)连接的是测试数据库,而上线(Prod)**需要连接生产数据库。如果在打包时手动修改配置文件,不仅繁琐,还容易因为误操作导致生产事故。

本文将介绍如何利用 Maven Profiles 结合 IDEA,实现"一键切换"环境打包,彻底告别手动修改配置文件的时代。


核心原理

Maven 提供了一个强大的功能叫 Profiles(配置文件) 。我们可以定义多套环境配置(如 devtestprod),并通过变量控制 Maven 在构建(Build)过程中加载不同的资源文件。


方案一:基于目录隔离(通用方案,推荐)

适用场景: 传统的 SSM 项目,或者希望打包后的 jar 包中只包含当前环境配置,不包含其他环境的杂乱文件。

1. 规划项目目录

src/main/resources 下,为不同环境建立独立的文件夹:

text 复制代码
src/main/resources
├── config-dev             <-- 开发环境目录
│   └── application.properties (数据库URL: 127.0.0.1)
├── config-prod            <-- 生产环境目录
│   └── application.properties (数据库URL: 192.168.x.x)
├── mapper                 <-- 公共资源
└── logback.xml            <-- 公共资源

2. 配置 pom.xml

我们需要做两件事:定义变量、控制资源加载。

xml 复制代码
<project>
    <!-- ... -->
    
    <!-- 1. 定义 Profiles -->
    <profiles>
        <profile>
            <id>dev</id>
            <properties>
                <env>config-dev</env> <!-- 定义变量 env 指向对应文件夹 -->
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault> <!-- 默认激活 dev -->
            </activation>
        </profile>
        <profile>
            <id>prod</id>
            <properties>
                <env>config-prod</env>
            </properties>
        </profile>
    </profiles>

    <build>
        <!-- 2. 动态资源加载 -->
        <resources>
            <!-- 加载对应环境的配置文件 -->
            <resource>
                <directory>src/main/resources/${env}</directory>
            </resource>
            <!-- 加载公共资源,并排除环境文件夹 -->
            <resource>
                <directory>src/main/resources</directory>
                <excludes>
                    <exclude>config-dev/**</exclude>
                    <exclude>config-prod/**</exclude>
                </excludes>
            </resource>
        </resources>
    </build>
</project>

方案二:Spring Boot 资源过滤(SpringBoot 专用)

适用场景: Spring Boot 项目,利用其多环境配置机制(application-{profile}.yml)。

1. 规划项目目录

文件通常平铺在 resources 目录下:

text 复制代码
src/main/resources
├── application.yml       <-- 主入口配置
├── application-dev.yml   <-- 开发配置详情
└── application-prod.yml  <-- 生产配置详情

2. 修改 application.yml

在主配置文件中,使用 Maven 的占位符(Spring Boot 推荐使用 @...@):

yaml 复制代码
spring:
  profiles:
    active: @profiles.active@  # 这里的值将由 Maven 打包时动态替换

3. 配置 pom.xml

开启资源过滤(Filtering),让 Maven 解析文件中的占位符。

xml 复制代码
<profiles>
    <profile>
        <id>dev</id>
        <properties>
            <profiles.active>dev</profiles.active> <!-- 对应 application-dev.yml -->
        </properties>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
    </profile>
    <profile>
        <id>prod</id>
        <properties>
            <profiles.active>prod</profiles.active> <!-- 对应 application-prod.yml -->
        </properties>
    </profile>
</profiles>

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering> <!-- 关键:必须开启过滤 -->
        </resource>
    </resources>
</build>

实操:在 IDEA 中一键切换

配置完成后,在 IntelliJ IDEA 中的操作步骤完全一致:

  1. 打开 Maven 面板 :点击 IDEA 右侧侧边栏的 Maven 标签。
  2. 找到 Profiles :展开项目下的 Profiles 文件夹。
  3. 勾选环境
    • 想打生产包:勾选 prod(此时 dev 会自动取消勾选)。
    • 想打开发包:勾选 dev
  4. 执行打包
    • Lifecycle 下,双击 clean(清理旧文件)。
    • 双击 package(开始打包)。

💡 小技巧 :勾选 Profile 后,如果代码中对变量的引用爆红,可以点击 Maven 面板左上角的 "Reload All Maven Projects"(刷新图标)来同步状态。


验证结果

不要盲目相信配置,建议第一次打包后进行验证:

  1. 打包完成后,在项目左侧文件树中找到 target 目录。
  2. 展开 target/classes 或解压生成的 .jar 包。
  3. 方案一验证 :检查根目录下是否有 application.properties,且内容是否为生产库地址。
  4. 方案二验证 :打开 application.yml,检查 active: @profiles.active@ 是否已被替换为 active: prod

进阶:CI/CD 命令行打包

如果你的项目使用 Jenkins 或 GitLab CI 进行自动化部署,不需要图形界面,只需在命令中加入 -P 参数:

bash 复制代码
# 打包开发环境
mvn clean package -Pdev

# 打包生产环境
mvn clean package -Pprod

总结

通过 Maven Profiles,我们实现了环境配置与代码的解耦:

  • 安全性提升:避免了手动修改配置导致的生产事故。
  • 效率提升:IDEA 图形化勾选,一键切换。
  • 标准化:无论是本地运行还是服务器构建,都统一管理。

建议根据你的项目类型(普通 Maven 项目选方案一,Spring Boot 选方案二)尽快接入这套流程。

相关推荐
Slow菜鸟2 小时前
MinIO教程(三)| Spring Boot 集成 MinIO 高级篇(分片上传、加密与优化)
spring boot·minio
s***55813 小时前
Skywalking介绍,Skywalking 9.4 安装,SpringBoot集成Skywalking
spring boot·后端·skywalking
至此流年莫相忘3 小时前
Springboot入参校验实战:使用 javax.validation 优雅处理参数校验
spring boot
烤麻辣烫4 小时前
黑马程序员苍穹外卖(新手) DAY3
java·开发语言·spring boot·学习·intellij-idea
百***49004 小时前
基于SpringBoot和PostGIS的各省与地级市空间距离分析
java·spring boot·spring
爱分享的鱼鱼5 小时前
Srpingboot入门:通过实践项目系统性理解Springboot框架
spring boot·后端·spring
wsaaaqqq5 小时前
springboot加载外部jar
spring boot
q***21606 小时前
【监控】spring actuator源码速读
java·spring boot·spring
原来是好奇心6 小时前
Spring AI 入门实战:快速构建智能 Spring Boot 应用
人工智能·spring boot·spring