1. 项目背景与核心需求
在Java项目开发中,我们经常遇到一个经典问题:如何在打包阶段动态修改配置文件中的某些参数?传统做法是手动修改配置文件然后提交代码,但这会带来两个严重问题:
- 敏感信息(如API密钥、服务地址)会被提交到代码仓库
- 不同环境(开发/测试/生产)需要不同的配置值
最近我在一个微服务项目中就遇到了这样的需求:需要为每个服务实例动态生成唯一的clientId前缀。经过多种方案对比,最终选择了Maven资源过滤+Groovy脚本的方案。这个方案最大的优势是:
- 配置与代码完全分离
- 打包时自动获取最新值
- 无需人工干预构建流程
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术方案详解
2.1 整体架构设计
整个方案的核心流程分为三个关键步骤:
- 初始化阶段:通过Groovy脚本从外部API获取动态值
- 资源过滤阶段:Maven处理资源文件时替换占位符
- 打包阶段:生成包含最终配置的部署包
mermaid复制graph TD
A[初始化阶段] -->|执行Groovy脚本| B[获取动态值]
B --> C[设置Maven属性]
D[资源过滤] -->|替换占位符| C
C --> E[生成最终配置]
2.2 关键技术选型
2.2.1 Maven资源过滤
资源过滤(Resource Filtering)是Maven提供的一个核心功能,它允许在资源文件中使用${property}或@property@占位符,在构建过程中自动替换为实际值。
为什么选择资源过滤而不是其他方案?
- 相比Spring Profile:不需要维护多套配置文件
- 相比环境变量:可以在打包阶段确定值,不依赖运行时环境
- 相比配置中心:简化部署依赖,适合中小型项目
2.2.2 Groovy Maven插件
groovy-maven-plugin让我们能在Maven生命周期中执行Groovy脚本,相比纯XML配置的优势:
- 可以编写复杂逻辑(网络请求、文件操作等)
- 比Shell脚本更跨平台
- 完美集成到Maven生命周期中
3. 详细实现步骤
3.1 配置资源过滤
首先在pom.xml中配置资源目录和过滤规则:
xml复制<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<excludes>
<exclude>static/**</exclude>
</excludes>
</resource>
