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>