1. 概述

本文将深入探讨 Maven 中的预定义属性。这些属性让构建配置更动态、灵活且可复用,支持分层设置默认值并按需覆盖。下面我们详细解析这些属性的用法和技巧。

2. Maven 预定义属性

Maven 内置了许多实用属性,可直接用于简化配置。我们甚至能在 pom.xml 中自定义它们。这些属性还能在资源文件(如 application.properties)中通过 Maven 资源插件的过滤功能使用,只需用 ${} 包裹即可。

2.1. 基础用法示例

以下示例展示如何使用输出目录属性:

<?xml version="1.0" encoding="UTF-8"?>
<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>example.override.properties</groupId>
    <artifactId>parameter-maven-plugin</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>maven-plugin</packaging>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-plugin-plugin</artifactId>
                <version>3.2</version>
                <configuration>  
                    <outputDirectory>${project.build.directory}</outputDirectory>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

✅ 此例通过 ${project.build.directory} 获取默认输出目录(即 target 目录)

2.2. 属性覆盖示例

通过自定义路径覆盖默认值:

<?xml version="1.0" encoding="UTF-8"?>
<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>example.override.properties</groupId>
    <artifactId>parameter-maven-plugin</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>maven-plugin</packaging>
    <build>
        <directory>src/main/resources/custom</directory>
    </build>
</project>

⚠️ 通过 <project> -> <build> -> <directory> 层级结构,将 ${project.build.directory} 覆盖为 src/main/resources/custom

3. 项目信息属性

这些属性用于访问项目元数据、配置和构建信息:

属性 说明
${project.packaging} 项目打包类型(默认 jar
${project.basedir} 项目根目录(pom.xml 所在位置)
${project.groupId} 项目组 ID(可继承父 POM)
${project.version} 项目版本(可继承父 POM)

4. 项目构建信息属性

控制构建过程文件存储位置的核心属性:

属性 默认值 说明
${project.build.directory} target/ 构建文件根目录
${project.build.outputDirectory} target/classes 主代码编译输出目录
${project.build.testOutputDirectory} target/test-classes 测试代码编译输出目录
${project.build.sourceDirectory} src/main/java 主代码源码目录
${project.build.testSourceDirectory} src/test/java 测试代码源码目录
${project.build.resources} src/main/resources 主资源文件目录
${project.build.testResources} src/test/resources 测试资源文件目录
${project.build.finalName} ${artifactId}-${version} 构建产物最终名称

5. 系统属性

Maven 能访问 JVM 或运行时定义的系统属性:

属性 说明
${java.home} JDK/JRE 安装路径(⚠️ 生产环境慎用,建议用 ${env.JAVA_HOME}
${java.version} Java 运行时版本
${os.name} 操作系统名称(如 Windows/macOS)
${os.version} 操作系统版本
${user.dir} Maven 执行时的工作目录

6. Maven 专用属性

Maven 运行时和配置相关属性:

属性 说明
${maven.version} 当前 Maven 版本
${settings.localRepository} 本地仓库路径(默认 ${user.home}/.m2/repository
${settings.interactiveMode} 是否启用交互模式(默认 true
${settings.offline} 是否启用离线模式(默认 false

7. 总结

Maven 预定义属性提供了强大的配置灵活性,建议始终优先使用这些属性而非硬编码路径或值。这不仅能提升项目可维护性,还能避免跨环境部署时的踩坑问题。合理运用这些属性,能让你的 pom.xml 更简洁高效。