多 Profile 组合与优先级
多 Profile 同时激活时,配置按优先级覆盖。
多 Profile 激活
命令行多 Profile
Bash
mvn package -Pdev,prod,debug
mvn package -Pprofile1,profile2,profile3
同时激活效果
XML
profile1 → profile2 → profile3
按声明顺序叠加配置
后激活覆盖先激活同属性
配置叠加规则
不同配置追加
XML
<!-- profile1 -->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>
</dependencies>
<!-- profile2 -->
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
激活 -Pprofile1,profile2 → 两依赖都生效
同配置覆盖
XML
<!-- profile1 -->
<properties>
<db.url>url1</db.url>
</properties>
<!-- profile2 -->
<properties>
<db.url>url2</db.url>
</properties>
激活 -Pprofile1,profile2 → db.url=url2
Profile 来源优先级
来源层级
XML
命令行 -P(最高)
↓
pom.xml Profile
↓
settings.xml Profile(最低)
同 ID 覆盖
XML
pom.xml 中 dev Profile
settings.xml 中 dev Profile
pom.xml Profile 优先
Profile 内元素优先级
元素覆盖顺序
XML
后激活 Profile 覆盖先激活 Profile 同元素
示例
Bash
<profiles>
<profile>
<id>base</id>
<properties>
<app.name>base-app</app.name>
<version>1.0</version>
</properties>
</profile>
<profile>
<id>override</id>
<properties>
<app.name>override-app</app.name> <!-- 覆盖 app.name -->
</properties>
</profile>
</profiles>
Bash
-Pbase,override
结果:app.name=override-app, version=1.0
依赖管理优先级
dependencies 覆盖
Bash
<profile>
<id>dev</id>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>my-lib</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
</profile>
<profile>
<id>prod</id>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>my-lib</artifactId>
<version>2.0.0</version> <!-- 覆盖版本 -->
</dependency>
</dependencies>
</profile>
XML
-Pdev,prod → my-lib:2.0.0
pluginManagement 优先级
Bash
<profile>
<id>dev</id>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>11</source>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</profile>
<profile>
<id>prod</id>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>17</source> <!-- 覆盖 -->
</configuration>
</plugin>
</plugins>
</pluginManagement>
</profile>
activeByDefault 与显式激活
默认 Profile
text
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>prod</id>
</profile>
激活规则
| 命令 | 激活 Profile |
|---|---|
| mvn package | dev(默认) |
| mvn package -Pprod | prod(禁用默认) |
| mvn package -Pdev,prod | dev,prod |
activeByDefault 禁用规则
text
显式指定 -P 后,activeByDefault 自动禁用
禁用 Profile
禁用特定 Profile
text
mvn package -P !dev
禁用所有 Profile
text
mvn package -P !*
查看最终配置
text
mvn help:effective-pom -Pdev,prod
查看合并后的完整配置。
Profile 组合最佳实践
推荐做法
| 做法 | 说明 |
|---|---|
| 避免 ID 冲突 | Profile ID 唯一 |
| 单一职责 | Profile 功能单一 |
| 明确覆盖 | 预期覆盖行为 |
| 文档说明 | Profile 用途注释 |
不推荐做法
| 做法 | 风险 |
|---|---|
| 多个 activeByDefault | 冲突混乱 |
| 同 ID 不同位置 | 覆盖难理解 |
| 循环依赖 | 配置复杂 |
Profile 组合示例
功能组合
text
<profiles>
<!-- 环境 Profile -->
<profile>
<id>dev</id>
<properties>
<env>dev</env>
</properties>
</profile>
<!-- 功能 Profile -->
<profile>
<id>debug</id>
<properties>
<debug.enabled>true</debug.enabled>
</properties>
</profile>
<!-- 工具 Profile -->
<profile>
<id>javadoc</id>
<build>
<plugins>
<plugin>
<artifactId>maven-javadoc-plugin</artifactId>
</plugin>
</plugins>
</build>
</profile>
</profiles>
text
# 开发 + 调试
mvn package -Pdev,debug
# 开发 + 文档
mvn package -Pdev,javadoc
# 全组合
mvn package -Pdev,debug,javadoc
要点总结
- 多 Profile 用逗号分隔激活
- 后激活 Profile 覆盖先激活同配置
- pom.xml Profile 优先 settings.xml
- 显式 -P 禁用 activeByDefault
- !ProfileID 禁用特定 Profile
- !* 禁用所有 Profile
- effective-pom 查看合并配置
📝 发现内容有误?点击此处直接编辑