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 选方案二)尽快接入这套流程。

相关推荐
二哈喇子!1 小时前
SpringBoot项目右上角选择ProjectNameApplication的配置
java·spring boot
二哈喇子!2 小时前
基于Spring Boot框架的车库停车管理系统的设计与实现
java·spring boot·后端·计算机毕业设计
二哈喇子!2 小时前
基于SpringBoot框架的水之森海底世界游玩系统
spring boot·旅游
二哈喇子!2 小时前
Java框架精品项目【用于个人学习】
java·spring boot·学习
二哈喇子!2 小时前
基于SpringBoot框架的网上购书系统的设计与实现
java·大数据·spring boot
二哈喇子!3 小时前
基于JavaSE的淘宝卖鞋后端管理系统的设计与实现
java·spring boot·spring
Coder_Boy_3 小时前
基于SpringAI的在线考试系统-智能考试系统-学习分析模块
java·开发语言·数据库·spring boot·ddd·tdd
高山上有一只小老虎4 小时前
mybatisplus实现分页查询
java·spring boot·mybatis
毕设源码-朱学姐5 小时前
【开题答辩全过程】以 基于SpringBoot的律师事务所管理系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
毕设源码-朱学姐6 小时前
【开题答辩全过程】以 基于springboot的日用药品仓库管理系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端