MVN5️⃣属性 & 资源配置
1、属性
1.1、引入
场景:项目中的多个依赖使用到相同版本,存在重复编写的问题。
示例:导入 Spring 系列依赖。
-
为了保证依赖兼容,通常用相同的依赖版本(如 5.3.17.RELEASE 版本)。
-
若项目升级,改用 5.3.18.RELEASE,此时所有依赖都需要更新。
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.17</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.3.17</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.3.17</version> </dependency>
分析
- 项目中的多个依赖用到相同的版本,存在重复编写的问题。
- 若依赖版本整体更新,所有依赖都需要修改 version,维护成本高。
- 引入属性,可实现复用。
1.2、属性(❗)
属性:类似 Java 变量,提高配置的复用性。
1.2.1、自定义属性
命名规范:通常以
类型.version
的形式。
示例:定义 Spring 系列的依赖版本。
-
格式:properties 标签下的自定义标签名,代表属性名。
<!-- 自定义属性 --> <properties> <spring.version>5.3.17.RELEASE</spring.version> </properties>
-
引用格式:
${自定义属性名}
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency>
1.2.2、其它属性
命令行(CMD)输入
mvn help:system
,可查看 Java 系统属性、环境变量属性。
说明 | 引用格式 | 示例 | |
---|---|---|---|
自定义属性(🔥) | 相当于定义变量,通常是依赖版本 | $ | $ |
内置属性 | Maven 内置属性 | ${project.属性名} (可省略前缀) |
${version} $ |
Setting 属性 | settings.xml 中的标签属性 | $ | $ |
Java 系统属性 | 类似 System.getProperties() | $ | $ |
环境变量属性 | 本地计算机的环境变量 | $ | $ |
2、资源配置
Hint:自定义属性可以被pom.xml使用,也可以被外部配置文件使用。
示例:在父模块的 pom.xml 定义 JDBC 相关配置,在子模块的 jdbc.properties 引用。
2.1、定义属性(❗)
在父模块的 pom.xml 中定义配置(子模块可通过继承获得配置)
-
定义属性:
<!-- 自定义属性 --> <properties> <jdbc.driver>com.mysql.cj.jdbc.Driver</jdbc.url> <jdbc.url>jdbc:mysql://localhost:3306/ssm</jdbc.url> </properties>
-
标识资源文件(👉 见 2.3.2 说明)
-
directory:资源文件目录(使用内置属性获得当前子模块路径,而无需硬编码)
-
fiiltering:开启属性过滤,才可解析配置文件中的
${}
。<build> <!-- 资源文件 --> <resources> <resource> <directory>${project.basedir}/src/main/resources</directory> <filtering>true</filtering> </resource> </resources> <!-- 测试资源文件 --> <testResources> <testResource> <directory>${project.basedir}/src/test/resources</directory> <filtering>true</filtering> </testResource> </testResources> </build>
-
说明:what for 标识资源文件?
机制:Maven 处理资源文件时(process-resources
),默认扫描当前模块的 src\main\resources
。
- 子模块继承了父模块配置,因此子模块构建时会去扫描父模块中的
src\main\resources
。 - 实际的资源文件位于子模块的
resources
下,此时会找不到资源文件。
2.2、引用属性
子模块的 jdbc.properties
# 引用存在的自定义属性
jdbc.driver=${jdbc.driver}
jdbc.url=${jdbc.url}
# 引用不存在的属性
jdbc.username=${jdbc.root}
# 未引用
jdbc.password=123456
2.3、测试效果
编译子模块,查看结果。
-
正常引用:成功引用并替换了
${}
内容。 -
引用不存在的/未引用:不发生变化。
3、实践:聚合+继承+属性
3.1、步骤(❗)
- 确定项目内容
- 项目中涉及的模块,模块间的依赖关系。
- 项目中使用的依赖,是否属于共有依赖,依赖版本是否通用。
- 创建空模块:作为聚合+继承模块,编写 pom.xml。
- 打包方式:pom
- 聚合管理:modules
- 自定义属性:properties
- 继承管理:dependencies 和 dependencyManagement
- 创建子模块:默认获得父模块的 dependencies
- 标识父模块:parent
- 定义可选依赖:dependencies
3.2、示例
示例:项目中有 ABC 模块,mnopq 依赖
-
确定项目内容:假定以下情况
- 涉及 ABC 模块,A 依赖 B 依赖 C。
- 涉及 mnopq 依赖,其中 mn 是共有依赖且版本通用,opq 分别是 ABC 的依赖。
-
创建空模块:
<groupId>xxx</groupId> <artifactId>parent</artifactId> <version>xxx</version> <!-- 打包方式 --> <packaging>pom</packaging> <!-- 聚合模块管理 --> <modules> <module>相对路径/projectA</module> <module>相对路径/projectB</module> <module>相对路径/projectC</module> </modules> <!-- 自定义属性 --> <properties> <mn.version>xxx</mn.version> <o.version>xxx</o.version> <p.version>xxx</p.version> <q.version>xxx</q.version> </properties> <!-- 父模块管理 --> <dependencies> <!-- 共有依赖 mn--> <dependency> <groupId>xxx</groupId> <artifactId>m</artifactId> <version>${mn.version}</version> </dependency> <dependency> <groupId>xxx</groupId> <artifactId>n</artifactId> <version>${mn.version}</version> </dependency> </dependencies> <dependencyManagement> <dependencies> <!-- 可选依赖 opq --> <dependency> <groupId>xxx</groupId> <artifactId>xxx</artifactId> <version>${o.version}</version> </dependency> <dependency> <groupId>xxx</groupId> <artifactId>xxx</artifactId> <version>${p.version}</version> </dependency> <dependency> <groupId>xxx</groupId> <artifactId>xxx</artifactId> <version>${q.version}</version> </dependency> </dependencies> </dependencyManagement>
-
创建子模块:通过 parent 标识父模块。
-
GAV:默认继承父模块的 GV,子模块仅需保留 artifact。
-
依赖:默认获得父模块 dependencies 的依赖,定义 GA 导入可选依赖。
<artifactId>当前模块名</artifactId> <parent> <!-- 父模块的 GAV --> <groupId>xxx</groupId> <artifactId>parent</artifactId> <version>xxx</version> </parent> <dependencies> <!-- 可选依赖 --> </dependencies>
-