1. 概述

在本篇短小精悍的教程中,我们将探讨如何在 Maven 的 pom.xml 文件中读取环境变量,从而灵活定制构建行为。

这种方式在 CI/CD 流水线中尤为常见——比如根据不同的部署环境动态设置编译版本、启用特定插件等。✅

2. 环境变量的使用

✅ 基本语法:${env.VARIABLE_NAME}

要在 pom.xml 中引用环境变量,标准写法是使用 ${env.VARIABLE_NAME} 占位符。

举个实际场景:我们想让 Java 编译版本由外部环境控制,而不是写死在配置里。这样就能在不同机器或流水线中自由切换 JDK 版本。

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.12.1</version>
            <configuration>
                <source>${env.JAVA_VERSION}</source>
                <target>${env.JAVA_VERSION}</target>
            </configuration>
        </plugin>
    </plugins>
</build>

⚠️ 注意:如果运行时没有设置 JAVA_VERSION 环境变量,Maven 会直接报错,构建失败。所以你必须提前设置。

🐧 Linux/macOS 设置方式:

export JAVA_VERSION=11
mvn clean package

💹 Windows 设置方式:

set JAVA_VERSION=11
mvn clean package

✅ 提供默认值:使用 Maven Profile

光靠环境变量不够健壮——万一忘了设呢?我们可以通过 Maven Profile 来兜底,提供一个默认的 Java 版本。

<profiles>
    <profile>
        <id>default-java</id>
        <activation>
            <property>
                <name>!env.JAVA_VERSION</name>
            </property>
        </activation>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.12.1</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

📌 关键点解释:

  • <activation><property><name>!env.JAVA_VERSION</name></property></activation>
    表示:JAVA_VERSION 环境变量不存在时,激活此 profile
  • Profile 中定义的 maven-compiler-plugin 会覆盖主配置中的同名插件。
  • 这样就实现了“有环境变量用环境变量,没有就走默认值”的优雅降级策略。✅

💡 小贴士:这种模式在多环境构建中非常实用,比如 dev/staging/prod 使用不同配置源,但又不想把敏感信息写进代码。

3. 总结

通过 ${env.VAR_NAME} 语法,我们可以轻松将外部环境变量注入到 Maven 构建流程中,实现高度可配置的构建逻辑。

再配合 Maven Profile 的条件激活机制,既能保持灵活性,又能避免因变量缺失导致构建中断。

✅ 推荐实践:

  • 在 CI 脚本中统一设置关键环境变量
  • 对非强制变量提供合理的默认 profile
  • 避免在 pom.xml 中硬编码环境相关参数

这套组合拳在实际项目中属于“简单粗暴但极其有效”的踩坑经验,建议集合备用。


原始标题:Refer to Environment Variables in pom.xml