Profile 是 Maven 提供的一种机制,允许为不同的环境或条件定制构建过程。通过 Profile,可以在不同环境下使用不同的配置,如开发、测试、生产环境。
<profiles>
<profile>
<id>development</id>
<properties>
<env>dev</env>
<database.url>jdbc:mysql://localhost:3306/myapp_dev</database.url>
<log.level>DEBUG</log.level>
</properties>
<dependencies>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>2.1.214</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</profile>
<profile>
<id>production</id>
<properties>
<env>prod</env>
<database.url>jdbc:mysql://prod-server:3306/myapp</database.url>
<log.level>WARN</log.level>
</properties>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</profile>
</profiles>
<profile>
<id>development</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<!-- Profile 配置 -->
</profile>
<profile>
<id>production</id>
<activation>
<property>
<name>env</name>
<value>prod</value>
</property>
</activation>
<!-- Profile 配置 -->
</profile>
<profile>
<id>jdk11</id>
<activation>
<jdk>11</jdk>
</activation>
<!-- JDK 11 特定配置 -->
</profile>
<profile>
<id>jdk8-plus</id>
<activation>
<jdk>[1.8,)</jdk>
</activation>
<!-- JDK 8 及以上版本配置 -->
</profile>
<profile>
<id>windows</id>
<activation>
<os>
<family>windows</family>
</os>
</activation>
<!-- Windows 特定配置 -->
</profile>
<profile>
<id>unix</id>
<activation>
<os>
<family>unix</family>
</os>
</activation>
<!-- Unix/Linux 特定配置 -->
</profile>
<profile>
<id>integration-tests</id>
<activation>
<file>
<exists>src/test/integration</exists>
</file>
</activation>
<!-- 集成测试配置 -->
</profile>
<profile>
<id>no-tests</id>
<activation>
<file>
<missing>src/test</missing>
</file>
</activation>
<!-- 无测试配置 -->
</profile>
| 元素 | 描述 | 示例 |
|---|---|---|
| properties | 定义属性 | <env>dev</env> |
| dependencies | 添加依赖 | 特定环境的数据库驱动 |
| dependencyManagement | 依赖管理 | 版本控制 |
| repositories | 仓库配置 | 私有仓库 |
| pluginRepositories | 插件仓库 | 插件源 |
| build | 构建配置 | 插件配置 |
| modules | 模块配置 | 多模块项目 |
| reporting | 报告配置 | 代码质量报告 |
<profiles>
<!-- 开发环境 -->
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<db.driver>org.h2.Driver</db.driver>
<db.url>jdbc:h2:mem:testdb</db.url>
<db.username>sa</db.username>
<db.password></db.password>
</properties>
<dependencies>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>2.1.214</version>
</dependency>
</dependencies>
</profile>
<!-- 生产环境 -->
<profile>
<id>prod</id>
<properties>
<db.driver>com.mysql.cj.jdbc.Driver</db.driver>
<db.url>jdbc:mysql://prod-db:3306/myapp</db.url>
<db.username>${db.prod.username}</db.username>
<db.password>${db.prod.password}</db.password>
</properties>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
</dependencies>
</profile>
</profiles>
<profiles>
<!-- 快速构建(跳过测试和检查) -->
<profile>
<id>fast</id>
<properties>
<maven.test.skip>true</maven.test.skip>
<checkstyle.skip>true</checkstyle.skip>
<spotbugs.skip>true</spotbugs.skip>
</properties>
</profile>
<!-- 完整质量检查 -->
<profile>
<id>quality</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>3.1.2</version>
<executions>
<execution>
<phase>validate</phase>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<!-- ~/.m2/settings.xml -->
<settings>
<profiles>
<profile>
<id>company-repo</id>
<repositories>
<repository>
<id>company-nexus</id>
<url>http://nexus.company.com/repository/maven-public/</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>company-nexus-plugins</id>
<url>http://nexus.company.com/repository/maven-public/</url>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>company-repo</activeProfile>
</activeProfiles>
</settings>
检查激活条件是否满足,使用 mvn help:active-profiles 查看
确保属性在正确的 Profile 中定义,并且 Profile 已激活
不同 Profile 中的依赖可能产生冲突,需要仔细管理版本