大家好,我是烤鸭:

    今天分享一下maven项目引入"快照"版依赖的问题。

 

1.  snapshot 和 realease

顾名思义 就是 快照和稳定版。快照是不稳定的开发版本,不定时更新。稳定版不会有这个问题。

不定时更新有什么危害。

maven install 或者package 的时候,如果 pom中依赖的版本是快照版,会从私服或者中央仓库同步一下快照版本的jar包。如果这个时候jar包作者 恰好 deploy了未经测试或者改动了代码(未兼容之前的代码),就会影响到当前项目。

maven 稳定包仓库:

https://mvnrepository.com/

快照包仓库:

https://repo.spring.io/snapshot/

 2.  举个栗子

我们以 spring-boot-parent 这个包为例,下面是这个版本 2.2.4.BUILD-SNAPSHOT 快照包地址 

https://repo.spring.io/snapshot/org/springframework/boot/spring-boot-parent/2.2.4.BUILD-SNAPSHOT/

我们看下这三个包的发布时间,是 2020.1.20 . 11点12点和16点分别发布了。

Maven snapshot最新 maven snapshot 不更新_Maven snapshot最新

pom文件的配置。

这里强调一下 updatePolicy 属性。

(默认) always 每次打包都会看远程是否有新包

daily 当天拉过就不会再拉了

interval 指定时间间隔

never 永不(当稳定版使用)

<!--指定远程仓库地址 -->
    <repositories>
        <repository>
            <id>spring-snapshots</id>
            <url>https://repo.spring.io/snapshot</url>
            <snapshots>
                <enabled>true</enabled>
                <updatePolicy>always</updatePolicy>
            </snapshots>
        </repository>
        <repository>
            <id>spring-milestones</id>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>true</enabled>
                <updatePolicy>never</updatePolicy>
            </snapshots>
        </repository>
    </repositories>

简单来说,当你项目里配置了快照版,如果更新的内容恰好不兼容之前的代码(方法删了或者换参数了),就会导致项目的灾难问题。以上面的为例,可能11:30 之前项目是没问题的,这时候快照仓库发了一个版本,重新打包之后,项目就起不来了。

 3.  实际项目遇到的情况

运行正常的项目,代码没改动什么,突然报错类找不到。

Maven snapshot最新 maven snapshot 不更新_java_02

跟对方沟通,才发现我们引入的是快照版,这个可太危险了...

Maven snapshot最新 maven snapshot 不更新_Maven snapshot最新_03

4.  总结

其实我们这个还好,之前遇到过引用 springboot 快照版的时候,测试都正常,上线的时候一直启动失败。。。

最后发现是发布了新的快照版,而且对之前的方法有改动,快照可以在联调的时候使用,生产千万别用。