Maven实战-第十二篇(Maven中的版本)

Maven实战-第十二篇(Maven中的版本)

通过之前的内容我们知道,如果我们想引入一个依赖,必须要指定三个元素。分别是groupIdartifactId、和version。前两个元素我们已经详细介绍过了,今天我们详细介绍一下version元素。


稳定版本

稳定版本也就是我们平常中常用到的版本例如数字版本,当然还并不是只有数字版本的才叫稳定版本,例如还有一此依赖包是Alpha和Final版本的,这些也都是稳定的版本。例如我之前文档中多次介绍过的fastjson依赖,我们使用的就是它的稳定版本,并且是数字的稳定版本。

  • pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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">
    <parent>
        <artifactId>midai-mazhe-maven</artifactId>
        <groupId>cn.ma-zhe</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>mazhe-maven-order</artifactId>

    <dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>2.0.35</version>
        </dependency>
    </dependencies>

</project>

当然它也有其它稳定版本,但不是数字命名的。

Maven实战-第十二篇(Maven中的版本)

稳定版本的特点就是,当我们引入依赖时,如果发现本地仓库中有则Maven不会去远程仓库中寻找,直接引用。当然这也有一个弊端,就是如果我们自己开发了一个依赖,并且命名了一个版本,当我们自己针对这个版本进行代码修改时后,在部署时如果我们自己不修改版本时,Maven不会进行覆盖的,也就是Maven中的本地仓库还是原来的版本,Maven这么做的目的就是保证稳定版本的稳定。

快照

下面我们介绍一下Maven中的快照版本,这个版本和稳定版有一点点不同。下面我们通过下面的例子解释一下,Maven为什么要分快照版本。


假如我们在开发一个项目,期中小张在开发模块A的2.1版本,该版本还未正式发布,与模块A一同开发的还有模块B,它由小张的同事季MM开发,B的功能依赖于A的功能。所以在项目开发的过程中,小张需要经常将自己最新的模块打包,交给季MM,供她开发和集成调试,问题是,这个工作如何进行呢?

  • 方案一

让季MM自己签出模块A的源码进行构建。这种方法能够确保季MM得到模块A的最新构件,不过她不得不去构建模块A。多了一些版本控制和Maven操作还不算,当构建A失败的时候,她会是一头雾水,最后不得不找小张解决。显然,这种方式是低效的。

  • 方案二

重复部署模块A的2.1版本供季MM下载。虽然小张能够保证仓库中的构件是最新的,但对于Maven来说,同样的版本和同样的坐标就意味着同样的构件。因此,如果季MM在本机的本地仓库包含了模块A的2.1版本构件,Maven就不会再对照远程仓库进行更新。除非她每次执行Maven命令之前,清除本地仓库,但这种要求手工干预的做法显然也是不可取的。因为不太方便。

  • 方案三

还有一个办法,就是小张不停的更新模块A版本号,例如:2.1.1、2.1.2、2.1.3……。首先,小张和季MM两人都需要频繁地更改POM,如果有更多的模块依赖于模块A,就会涉及更多的POM更改;其次,大量的版本其实仅仅包含了微小的差异,有时候是对版本号的滥用,并且没有从根本上解决上述的问题。


那到底如何解决上述的问题呢?最好的办法最就是采用Maven中的快照版本机制解决上述问题,这也是快照版本和稳定版本的本质区别。在上面的例中,小张只需要将模块A的版本设定为2.1-SNAPSHOT,然后发布到私服中,在发布的过程中,Maven会自动为构件打上时间戳。比如2.1-20091214.221414-13就表示2009年12月14日22点14分14秒的第13次快照。有了该时间戳,Maven就能随时找到仓库中该构件2.1-SNAPSHOT版本最新的文件。这时,季MM配置对于模块A的2.1-SNAPSHOT版本的依赖,当她构建模块B的时候,Maven会自动从仓库中检查模块A的2.1-SNAPSHOT的最新构件,当发现有更新时便进行下载。默认情况下,Maven每天检查一次更新,当然我们也可通过updatePolicy参数控制。用户也可以使用命令行-U参数强制让Maven检查更新,如mvn clean install-U。这样我们就完美的解决了上述的问题。因为上面的演示需要使用私服的才可以演示,但我们还没介绍如何搭建私服,所以本篇就不在进行项目演示了,等后续的内容中,我们在详细介绍一下。

给TA打赏
共{{data.count}}人
人已打赏
Maven

Maven实战-第十一篇(Maven中的镜像)

2023-7-29 6:14:12

Maven

Maven实战-第十三篇(Maven的生命周期)

2023-8-1 6:16:29