maven属性

Maven 属性详解:掌握配置灵活性的核心

Maven 属性是提升构建配置灵活性的关键机制,它允许在 POM 文件中定义和引用变量,实现配置的复用与动态调整。Maven 提供了六类属性,涵盖内置变量、项目配置、自定义参数等场景。

内置属性(Built-in Properties)

Maven 预定义的基础属性,无需配置即可直接使用,主要用于访问项目核心路径和版本信息。

属性 含义
${basedir} 项目根目录(包含 pom.xml 的目录)
${version} 项目版本号(等价于 ${project.version}
${project.groupId} 项目的 groupId(组织标识)
${project.artifactId} 项目的 artifactId(项目标识)

POM 属性(Project Properties)

直接映射 pom.xml 中的配置,用于访问项目构建相关的路径和配置信息。

常用 POM 属性:

属性 含义 默认值
${project.build.sourceDirectory} 主源码目录 src/main/java
${project.build.testSourceDirectory} 测试源码目录 src/test/java
${project.build.directory} 构建输出根目录 target
${project.build.outputDirectory} 主代码编译输出目录 target/classes
${project.build.testOutputDirectory} 测试代码编译输出目录 target/test-classes
${project.build.finalName} 打包后的文件名 ${project.artifactId}-${project.version}

自定义属性(User-defined Properties)

用户在 pom.xml<properties> 标签中自定义的属性,用于统一管理版本号、路径等可复用的配置。

示例

<properties>
    <!-- 定义依赖版本 -->
    <log4j.version>2.17.1</log4j.version>
    <jdk.version>1.8</jdk.version>
    
    <!-- 定义路径 -->
    <custom.src.dir>${project.basedir}/src/main/custom</custom.src.dir>
</properties>

<!-- 引用自定义属性 -->
<dependencies>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>${log4j.version}</version> <!-- 引用版本属性 -->
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>${jdk.version}</source> <!-- 引用JDK版本 -->
                <target>${jdk.version}</target>
            </configuration>
        </plugin>
    </plugins>
</build>

优势:集中管理易变配置(如版本号),修改时只需更新一处。

Settings 属性(Settings Properties)

引用 Maven 全局配置文件 settings.xml 中的内容,前缀为 settings.

常用 Settings 属性:

属性 含义
${settings.localRepository} 本地仓库路径(默认 ~/.m2/repository
${settings.proxies} 代理配置信息
${settings.servers} 服务器认证信息(如私服账号密码)

注意settings.xml 中的敏感信息(如密码)通常不直接在 POM 中引用,而是通过插件间接使用。

Java 系统属性(Java System Properties)

引用 Java 虚拟机的系统属性,可通过 java -D 参数传递,或使用默认 JVM 属性。

常用 Java 系统属性:

属性 含义
${user.home} 当前用户的主目录
${user.dir} 当前工作目录
${java.home} JRE 安装目录
${os.name} 操作系统名称

查看所有 Java 系统属性

mvn help:system  # 输出所有系统属性和环境变量

环境变量属性(Environment Variables)

引用操作系统的环境变量,前缀为 env.,大小写敏感。

常用环境变量属性:

属性 含义
${env.JAVA_HOME} Java 安装目录
${env.PATH} 系统路径变量
${env.USER} 当前用户名(Linux/Mac)
${env.USERNAME} 当前用户名(Windows)

属性的使用场景与技巧

  1. 版本统一管理

    <properties>
        <spring.boot.version>2.7.0</spring.boot.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>${spring.boot.version}</version>
        </dependency>
    </dependencies>
  2. 动态路径配置

    <build>
        <resources>
            <resource>
                <directory>${project.basedir}/src/main/resources</directory>
                <filtering>true</filtering> <!-- 启用属性过滤 -->
            </resource>
        </resources>
    </build>

    此时资源文件(如 application.yml)中可直接使用 Maven 属性:

    app.name=${project.artifactId}
    app.version=${project.version}
  3. 命令行覆盖属性
    通过 -D 参数在命令行临时修改属性值:

    mvn package -Dlog4j.version=2.18.0  # 临时覆盖log4j版本
  4. 条件激活配置
    结合 Profile 实现不同环境下的属性切换:

    <profiles>
        <profile>
            <id>dev</id>
            <properties>
                <env>development</env>
            </properties>
        </profile>
        <profile>
            <id>prod</id>
            <properties>
                <env>production</env>
            </properties>
        </profile>
    </profiles>