Maven完全指南 - 4. 属性管理

165 阅读1分钟

4. 属性管理

Maven 中的属性管理通过 <properties> 标签进行 属性定义,为项目提供灵活、集中和可重用的配置管理。属性可以用于定义项目的版本、依赖的 URL、目录路径等信息,能够极大简化和抽象配置。属性引用 是通过 ${propertyName} 的语法来访问已定义的属性值,从而避免重复配置和增强灵活性。引用属性时,Maven 会在构建时解析并替换这些占位符。

使用示例:

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>my-app</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <java.version>17</java.version>
        <encoding>UTF-8</encoding>
        <maven.compiler.source>${java.version}</maven.compiler.source>
        <maven.compiler.target>${java.version}</maven.compiler.target>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>${maven.compiler.source}</source>
                    <target>${maven.compiler.target}</target>
                    <encoding>${encoding}</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

4.1 属性定义

属性定义可以使用两种方式:

  • 配置文件中定义:在 <properties> 元素中定义属性。
  • 命令行参数定义:在构建命令中使用 -D 选项定义属性。

命令行中定义的属性优先级最高,会覆盖配置文件中的同名属性。

4.2 内置属性

Maven 提供了许多内置属性,这些内置属性无需定义就可以直接使用,方便在 pom.xml 中访问项目的配置信息、系统路径、依赖信息等,从而实现动态的配置管理。常见的包括以下几种:

4.2.1 项目相关属性

这些属性用于获取当前项目的各种信息:

  • ${project.groupId}:项目的 groupId。
  • ${project.artifactId}:项目的 artifactId。
  • ${project.version}:项目的版本号。
  • ${project.packaging}:项目的打包类型(如 jar、war 等)。
  • ${project.name}:项目名称。
  • ${project.description}:项目描述。
  • ${project.url}:项目的网址。
4.2.2 构建相关属性

这些属性用于获取构建环境的配置信息:

  • ${project.build.sourceDirectory}:源码目录(通常为 src/main/java)。
  • ${project.build.testSourceDirectory}:测试源码目录(通常为 src/test/java)。
  • ${project.build.outputDirectory}:编译输出目录(通常为 target/classes)。
  • ${project.build.testOutputDirectory}:测试编译输出目录(通常为 target/test-classes)。
  • ${project.build.directory}:项目构建目录(通常为 target)。
4.2.3 环境相关属性

这些属性用于获取 Maven 运行环境的信息:

  • ${basedir}:当前项目的根目录。
  • ${user.home}:当前用户的主目录。
  • ${java.home}:当前 Java 安装的主目录。
  • ${maven.home}:Maven 的安装目录。
  • ${env.*}:系统环境变量,通过 ${env.VARIABLE_NAME} 的格式访问。
4.2.4 父项目的属性

如果项目有父项目,可以访问父项目的属性:

  • ${project.parent.groupId}:父项目的 groupId。
  • ${project.parent.artifactId}:父项目的 artifactId。
  • ${project.parent.version}:父项目的版本。

4.3 属性继承

在父子项目的继承关系中,子项目会继承父项目的 <properties> 属性定义。当子项目和父项目中存在同名属性时,子项目的定义会覆盖父项目的属性。

注意:虽然子项目会继承父项目的<group><version>等标签,但我们无法在<parent>中使用属性引用。

<!-- <parent>中引用属性是不可以的,这个示例配置会报错 -->
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>${parent.groupId}</groupId> <!-- 使用属性 -->
        <artifactId>${parent.artifactId}</artifactId> <!-- 使用属性 -->
        <version>${project.version}</version> <!-- 使用属性 -->
    </parent>
    <artifactId>child-project</artifactId>
</project>