• Maven项目属性与版本管理


    本次将介绍两个内容,分别是:

    • 属性
    • 版本管理

    1. 属性

    1.1 问题分析

    我们先来分析一下问题:

    前面在父工程中的dependencyManagement标签中对项目中所使用的jar包版本进行了统一的管理,但是如果在标签中有如下的内容:

    在这里插入图片描述

    你会发现,如果我们现在想更新Spring的版本,你会发现我们依然需要更新多个jar包的版本,这样的话还是有可能出现漏改导致程序出问题,而且改起来也是比较麻烦。

    问题清楚后,我们需要解决的话,就可以参考变量,声明一个变量,在其他地方使用该变量,当变量的值发生变化后,所有使用变量的地方,就会跟着修改,即:

    在这里插入图片描述

    1.2 解决步骤

    步骤1:父工程中定义属性

        <properties>
            <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
            <maven.compiler.source>1.8maven.compiler.source>
            <maven.compiler.target>1.8maven.compiler.target>
            <spring.version>5.2.12.RELEASEspring.version>
            <javax.servlet.api>3.1.0javax.servlet.api>
            <mybatis>3.5.10mybatis>
            <mysql.connector.java>8.0.30mysql.connector.java>
            <jackson.databind>2.9.8jackson.databind>
            <mybatis.spring>2.0.7mybatis.spring>
            <druid>1.2.11druid>
            <lombok>1.18.24lombok>
            <junit>4.13.2junit>
        properties>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    步骤2:修改依赖的version

        <dependencies>
            <dependency>
                <groupId>org.springframeworkgroupId>
                <artifactId>spring-webmvcartifactId>
                <version>${spring.version}version>
            dependency>
            <dependency>
                <groupId>org.springframeworkgroupId>
                <artifactId>spring-jdbcartifactId>
                <version>${spring.version}version>
            dependency>
            <dependency>
                <groupId>org.springframeworkgroupId>
                <artifactId>spring-testartifactId>
                <version>${spring.version}version>
            dependency>
            <dependency>
                <groupId>javax.servletgroupId>
                <artifactId>javax.servlet-apiartifactId>
                <version>${javax.servlet-api.version}version>
                <scope>providedscope>
            dependency>
            <dependency>
                <groupId>org.mybatisgroupId>
                <artifactId>mybatisartifactId>
                <version>${mybatis.version}version>
            dependency>
            <dependency>
                <groupId>mysqlgroupId>
                <artifactId>mysql-connector-javaartifactId>
                <version>${mysql-connector-java.version}version>
            dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.coregroupId>
                <artifactId>jackson-databindartifactId>
                <version>${jackson-databind.version}version>
            dependency>
            <dependency>
                <groupId>org.mybatisgroupId>
                <artifactId>mybatis-springartifactId>
                <version>${mybatis-spring.version}version>
            dependency>
    
            <dependency>
                <groupId>com.alibabagroupId>
                <artifactId>druidartifactId>
                <version>${druid.version}version>
            dependency>
            <dependency>
                <groupId>org.projectlombokgroupId>
                <artifactId>lombokartifactId>
                <version>${lombok.version}version>
                <scope>providedscope>
            dependency>
        dependencies>
    
        
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>junitgroupId>
                    <artifactId>junitartifactId>
                    <version>${junit.version}version>
                    <scope>testscope>
                dependency>
            dependencies>
        dependencyManagement>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67

    此时,我们只需要更新父工程中properties标签中所维护的jar包版本,所有子项目中的版本也就跟着更新。当然除了将spring相关版本进行维护,我们可以将其他的jar包版本也进行抽取,这样就可以对项目中所有jar包的版本进行统一维护,如:

    
        <properties>
            <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
            <maven.compiler.source>1.8maven.compiler.source>
            <maven.compiler.target>1.8maven.compiler.target>
            <spring.version>5.2.12.RELEASEspring.version>
            <javax.servlet-api.version>3.1.0javax.servlet-api.version>
            <mybatis.version>3.5.10mybatis.version>
            <mysql-connector-java.version>8.0.30mysql-connector-java.version>
            <jackson-databind.version>2.9.8jackson-databind.version>
            <mybatis-spring.version>2.0.7mybatis-spring.version>
            <druid.version>1.2.11druid.version>
            <lombok.version>1.18.24lombok.version>
            <junit.version>4.13.2junit.version>
        properties>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    2. 配置文件加载属性

    Maven中的属性我们已经介绍过了,现在也已经能够通过Maven来集中管理Maven中依赖jar包的版本。但是又有新的需求,就是想让Maven对于属性的管理范围能更大些,比如我们之前项目中的jdbc.properties,这个配置文件中的属性,能不能也来让Maven进行管理呢?

    答案是肯定的,具体的实现步骤为:

    步骤1:父工程定义属性

    <properties>
       <jdbc.url>jdbc:mysql://localhost:3306/mybatisjdbc.url>
        <jdbc.driver>com.mysql.cj.jdbc.Driverjdbc.driver>
        <jdbc.username>rootjdbc.username>
        <jdbc.password>rootjdbc.password>
    properties>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    步骤2:jdbc.properties文件中引用属性

    jdbc.properties,将属值直接获取Maven配置的属性

    jdbc.driver=${jdbc.driver}
    jdbc.url=${jdbc.url}
    jdbc.username=${jdbc.username}
    jdbc.password=${jdbc.password}
    
    • 1
    • 2
    • 3
    • 4

    步骤3:设置maven过滤文件范围

    Maven在默认情况下是从当前项目的src\main\resources下读取文件进行打包。现在我们需要打包的资源文件是在maven_02_ssm下,需要我们通过配置来指定下具体的资源目录。

        <build>
            <resources>
                
                <resource>
                    <directory>../maven_02_ssm/src/main/resourcesdirectory>
                    
                    <filtering>truefiltering>
                resource>
            resources>
        build>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    说明: directory路径前要添加../的原因是maven_02_ssm相对于父工程的pom.xml路径是在其上一层的目录中,所以需要添加。

    修改完后,注意maven_02_ssm项目的resources目录就多了些东西,如下:

    在这里插入图片描述

    步骤4:测试是否生效

    测试的时候,只需要将maven_02_ssm项目进行打包,然后观察打包结果中最终生成的内容是否为Maven中配置的内容。

    在这里插入图片描述

    在这里插入图片描述

    上面的属性管理就已经完成,但是有一个问题没有解决,因为不只是maven_02_ssm项目需要有属性被父工程管理,如果有多个项目需要配置,该如何实现呢?

    方式一:

    <build>
        <resources>
            
            <resource>
                <directory>../maven_02_ssm/src/main/resourcesdirectory>
                <filtering>truefiltering>
            resource>
            <resource>
                <directory>../maven_03_ssm_pojo/src/main/resourcesdirectory>
                <filtering>truefiltering>
            resource>
            ...
        resources>
    build>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    可以配,但是如果项目够多的话,这个配置也是比较繁琐

    方式二:

    <build>
        <resources>
            
            <resource>
                <directory>${project.basedir}/src/main/resourcesdirectory>
                <filtering>truefiltering>
            resource>
        resources>
    build>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    说明: 打包的过程中如果报如下错误:

    在这里插入图片描述

    原因就是Maven发现你的项目为web项目,就会去找web项目的入口web.xml [配置文件配置的方式],发现没有找到,就会报错。

    解决方案1:在maven_02_ssm项目的src\main\webapp\WEB-INF\添加一个web.xml文件

    
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
             version="3.1">
    web-app>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    解决方案2:配置maven打包war时,忽略web.xml检查

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.pluginsgroupId>
                <artifactId>maven-war-pluginartifactId>
                <version>3.2.3version>
                <configuration>
                    <failOnMissingWebXml>falsefailOnMissingWebXml>
                configuration>
            plugin>
        plugins>
    build>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    上面我们所使用的都是Maven的自定义属性,除了${project.basedir},它属于Maven的内置系统属性。

    Maven中的属性分为:

    • 自定义属性(常用)
    • 内置属性
    • Setting属性
    • Java系统属性
    • 环境变量属性
    属性分类引用格式示例
    自定义属性${自定义属性名}${spring.version}
    内置属性${内置属性名}${basedir}、${version}
    Setting属性${Setting.属性名}${settings.localRepository}
    Java系统属性${系统属性分类.系统属性名}${user.home}
    环境变量属性${env.环境变量属性}${env.JAVE_HOME}

    具体如何查看这些属性:

    cmd命令行中输入mvn help:system

    在这里插入图片描述

    具体使用,就是使用 ${key}来获取,key为等号左边的,值为等号右边的,比如获取红线的值,对应的写法为 ${java.runtime.name}

    3. 版本管理

    关于这个版本管理解决的问题是,在Maven创建项目和引用别人项目的时候,我们都看到过如下内容:

    在这里插入图片描述

    在这里插入图片描述

    这里面有两个单词,SNAPSHOTRELEASE,它们所代表的含义是什么呢?

    我们打开Maven仓库地址https://mvnrepository.com/

    在这里插入图片描述

    在我们jar包的版本定义中,有两个工程版本用的比较多:

    • SNAPSHOT(快照版本)
      • 项目开发过程中临时输出的版本,称为快照版本
      • 快照版本会随着开发的进展不断更新
    • RELEASE(发布版本)
      • 项目开发到一定阶段里程碑后,向团队外部发布较为稳定的版本,这种版本所对应的构件文件是稳定的
      • 即便进行功能的后续开发,也不会改变当前发布版本内容,这种版本称为发布版本

    除了上面的工程版本,我们还经常能看到一些发布版本:

    • alpha版:内测版,bug多不稳定内部版本不断添加新功能
    • beta版:公测版,不稳定(比alpha稳定些),bug相对较多不断添加新功能
    • 纯数字版

    项目代码

  • 相关阅读:
    你有了解过这些架构设计,架构知识体系吗?(架构书籍推荐)
    遇到了2个有相同的JavaBean类
    一篇博客上手request和response
    HTML5新特性 day_04(8.10)地图、文件上传
    国民技术 N32G45x 串口踩坑
    【JavaWeb】GET和POST
    Oracle中的Rollup 使用方法
    牛客练习赛#84 F 莫比乌斯反演+杜教筛+技巧+斐波那契数列和gcd的结论+矩阵快速幂
    无人机助力智慧农田除草新模式,基于YOLOv8全系列【n/s/m/l/x】参数模型开发构建无人机航拍场景下的农田杂草检测识别系统
    什么是网络爬虫,爬虫的机制是那些
  • 原文地址:https://blog.csdn.net/qq_37726813/article/details/127875883