Maven 构建配置文件(Profiles)

什么是 Profile?

Profile 是 Maven 提供的一种机制,允许为不同的环境或条件定制构建过程。通过 Profile,可以在不同环境下使用不同的配置,如开发、测试、生产环境。

Profile 的类型

基本 Profile 配置

在 pom.xml 中定义 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 激活方式

1. 命令行激活

# 激活单个 Profile $ mvn clean install -Pdevelopment # 激活多个 Profile $ mvn clean install -Pdevelopment,testing # 禁用 Profile $ mvn clean install -P!production

2. 默认激活

<profile>
    <id>development</id>
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
    <!-- Profile 配置 -->
</profile>

3. 基于属性激活

<profile>
    <id>production</id>
    <activation>
        <property>
            <name>env</name>
            <value>prod</value>
        </property>
    </activation>
    <!-- Profile 配置 -->
</profile>
$ mvn clean install -Denv=prod

4. 基于 JDK 版本激活

<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>

5. 基于操作系统激活

<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>

6. 基于文件存在激活

<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>

Profile 可配置元素

元素 描述 示例
properties 定义属性 <env>dev</env>
dependencies 添加依赖 特定环境的数据库驱动
dependencyManagement 依赖管理 版本控制
repositories 仓库配置 私有仓库
pluginRepositories 插件仓库 插件源
build 构建配置 插件配置
modules 模块配置 多模块项目
reporting 报告配置 代码质量报告

实际应用示例

数据库配置 Profile

<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>

构建优化 Profile

<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>

Settings.xml 中的 Profile

<!-- ~/.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>

查看和管理 Profile

查看可用 Profile

# 查看所有可用的 Profile $ mvn help:all-profiles # 查看当前激活的 Profile $ mvn help:active-profiles

Profile 优先级

  1. 命令行指定的 Profile(-P 参数)
  2. 用户 settings.xml 中的 activeProfiles
  3. 全局 settings.xml 中的 activeProfiles
  4. POM 中 activeByDefault 为 true 的 Profile
注意:当通过命令行激活 Profile 时,所有 activeByDefault 的 Profile 都会被禁用。

最佳实践

常见问题

1. Profile 未激活

检查激活条件是否满足,使用 mvn help:active-profiles 查看

2. 属性未生效

确保属性在正确的 Profile 中定义,并且 Profile 已激活

3. 依赖冲突

不同 Profile 中的依赖可能产生冲突,需要仔细管理版本