在 Maven 的 pom.xml
文件中,${}
格式的变量(称为属性占位符)的值来源主要有以下几种途径:
1. 内置属性(Maven 预定义)
${project.basedir}
:项目根目录${project.version}
:项目版本${project.groupId}
:项目 Group ID${maven.build.timestamp}
:构建时间戳- 完整列表见 Maven Properties Reference。
2. **pom.xml
内自定义属性**
在 <properties>
标签中定义:
<properties><java.version>17</java.version><spring.version>5.3.10</spring.version>
</properties>
使用时:${java.version}
和 ${spring.version}
。
3. 父 POM 继承的属性
如果项目继承自父 POM(如 Spring Boot Starter Parent):
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.1.0</version>
</parent>
父 POM 中定义的属性(如 ${java.version}
)会自动继承。
4. Settings.xml 文件中的属性
在 Maven 的全局配置文件 ~/.m2/settings.xml
或项目级 settings.xml
中定义:
<settings><profiles><profile><properties><env>production</env></properties></profile></profiles>
</settings>
使用时:${env}
。
5. 命令行动态传入
通过 -D
参数在构建命令中传递:
mvn clean install -Dcustom.property=value
在 pom.xml
中直接使用 ${custom.property}
。
6. 环境变量
系统环境变量可通过 env.
前缀访问:
<!-- 获取操作系统环境变量 -->
<property><path>${env.PATH}</path>
</property>
7. 资源过滤(Resource Filtering)
在 src/main/resources
目录下的文件(如 application.properties
)中定义属性,并通过资源过滤传递到 pom.xml
:
<build><resources><resource><directory>src/main/resources</directory><filtering>true</filtering></resource></resources>
</build>
优先级顺序(高 → 低):
- 命令行参数(
-Dproperty=value
) pom.xml
中的<properties>
- 父 POM 中的属性
settings.xml
中的属性- 环境变量
- 内置属性
检查属性值来源
- 通过
mvn help:effective-pom
命令查看最终生效的 POM(包含所有属性解析结果)。 - 在构建时添加
-X
参数(调试模式)查看详细解析过程:mvn clean install -X
通过以上途径,Maven 在构建时会动态替换 pom.xml
中的所有 ${}
占位符。