MVN5️⃣属性 & 资源配置

1、属性

1.1、引入

场景:项目中的多个依赖使用到相同版本,存在重复编写的问题。

示例:导入 Spring 系列依赖。

  1. 为了保证依赖兼容,通常用相同的依赖版本(如 5.3.17.RELEASE 版本)。

  2. 若项目升级,改用 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 中定义配置(子模块可通过继承获得配置)

  1. 定义属性

    <!-- 自定义属性 -->
    <properties>
        <jdbc.driver>com.mysql.cj.jdbc.Driver</jdbc.url>
        <jdbc.url>jdbc:mysql://localhost:3306/ssm</jdbc.url>
    </properties>
    
  2. 标识资源文件(👉 见 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

  1. 子模块继承了父模块配置,因此子模块构建时会去扫描父模块中的 src\main\resources
  2. 实际的资源文件位于子模块的 resources 下,此时会找不到资源文件。

2.2、引用属性

子模块的 jdbc.properties

# 引用存在的自定义属性
jdbc.driver=${jdbc.driver}
jdbc.url=${jdbc.url}
# 引用不存在的属性
jdbc.username=${jdbc.root}
# 未引用
jdbc.password=123456

2.3、测试效果

编译子模块,查看结果。

  • 正常引用:成功引用并替换了 ${} 内容。

  • 引用不存在的/未引用:不发生变化。

    image

3、实践:聚合+继承+属性

3.1、步骤(❗)

  1. 确定项目内容
    • 项目中涉及的模块,模块间的依赖关系。
    • 项目中使用的依赖,是否属于共有依赖,依赖版本是否通用。
  2. 创建空模块:作为聚合+继承模块,编写 pom.xml。
    • 打包方式:pom
    • 聚合管理:modules
    • 自定义属性:properties
    • 继承管理:dependencies 和 dependencyManagement
  3. 创建子模块:默认获得父模块的 dependencies
    • 标识父模块:parent
    • 定义可选依赖:dependencies

3.2、示例

示例:项目中有 ABC 模块,mnopq 依赖

  1. 确定项目内容:假定以下情况

    • 涉及 ABC 模块,A 依赖 B 依赖 C。
    • 涉及 mnopq 依赖,其中 mn 是共有依赖且版本通用,opq 分别是 ABC 的依赖。
  2. 创建空模块

    <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>
    
  3. 创建子模块:通过 parent 标识父模块。

    • GAV:默认继承父模块的 GV,子模块仅需保留 artifact。

    • 依赖:默认获得父模块 dependencies 的依赖,定义 GA 导入可选依赖。

      <artifactId>当前模块名</artifactId>
      
      <parent>
          <!-- 父模块的 GAV -->
          <groupId>xxx</groupId>
          <artifactId>parent</artifactId>
          <version>xxx</version>
      </parent>
      
      <dependencies>
          <!-- 可选依赖 -->
      </dependencies>
      
posted @ 2022-09-05 01:26  Jaywee  阅读(50)  评论(0编辑  收藏  举报

👇