Profile 配置

返回构建工具

Profile 用于针对不同环境(开发、测试、生产)切换构建配置,避免在代码中硬编码环境差异。


Maven Profile

查看 Maven 详细文档

定义 Profile

<profiles>
    <profile>
        <id>dev</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <env>dev</env>
            <db.url>jdbc:mysql://localhost:3306/mydb</db.url>
        </properties>
    </profile>
 
    <profile>
        <id>prod</id>
        <properties>
            <env>prod</env>
            <db.url>jdbc:mysql://prod-server:3306/mydb</db.url>
        </properties>
    </profile>
</profiles>

激活方式

mvn package -P prod             # 手动激活
mvn package -P prod,metrics     # 激活多个
mvn package -P !dev             # 禁用指定

自动激活条件

<activation>
    <jdk>17</jdk>                          <!-- JDK 版本 -->
    <property><name>ENV</name><value>prod</value></property>  <!-- 环境变量 -->
    <file><exists>prod.properties</exists></file>             <!-- 文件存在 -->
</activation>

结合资源过滤

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

application.properties 中使用占位符,构建时自动替换:

db.url=${db.url}
app.env=${env}
mvn help:active-profiles    # 查看当前激活的 Profile

Gradle 环境切换

查看 Gradle 详细文档

Gradle 没有内置 Profile,通常通过项目属性实现:

./gradlew build -Penv=prod
// build.gradle.kts
val env = project.findProperty("env") as String? ?: "dev"
 
tasks.processResources {
    filesMatching("application.properties") {
        expand("env" to env)
    }
}

多资源目录按环境加载:

sourceSets {
    main {
        resources {
            srcDirs("src/main/resources", "src/main/resources-$env")
        }
    }
}

Spring Boot 配合

Spring Boot 项目通过 application-{profile}.yml 区分环境:

src/main/resources/
├── application.yml           # 公共配置
├── application-dev.yml
├── application-test.yml
└── application-prod.yml
java -jar app.jar --spring.profiles.active=prod

相关文档