论mvn snapshot版本的危害

简介: 今天遇到的一个aone编译不通过的问题,再一次证明了在生产环境依赖mvn snapshot版本的风险和危害。 ## 起因 针对一个变更修改代码,本地运行单元测试的时候编译不通过。昨天运行单元测试的时候还是正常的,而且编译不同过的类和引起编译失败的二方库都没有被修改到。 ## 排查 1. 尝试在aone预发环境进行部署,编译失败; 2. 下掉aone预发环境所有变更,直接部

今天遇到的一个aone编译不通过的问题,再一次证明了在生产环境依赖mvn snapshot版本的风险和危害。

起因

针对一个变更修改代码,本地运行单元测试的时候编译不通过。昨天运行单元测试的时候还是正常的,而且编译不同过的类和引起编译失败的二方库都没有被修改到。

排查

  1. 尝试在aone预发环境进行部署,编译失败;
  2. 下掉aone预发环境所有变更,直接部署master分支,成功;
  3. 在个人pc上编译打包应用的master分支,编译失败;

2,3两步使用的maven版本是一样的,而且都是对master分支打包,但个人pc上却出现了编译失败。
之后,登陆aone预发环境打包master成功的打包机,在代码目录下执行aone构建日志中的打包命令,打包成功:

执行下面的mvn命令,却出现了编译错误:

mvn -U clean package -Dmaven.test.skip=true -DskipTests=true -Dappname=matrixexchange -DAPP_NAME=matrixexchange -Pmatrixexchange

由此怀疑是aone实际执行的打包命令中有些特殊的命令行参数会影响打包结果。自己查看aone打包命令后,发现其中有一些关于依赖缓存的命令行参数,也就是截图中红框内的-D参数。

尝试执行去掉dependency.graph.cache.enable,dependency.graph.cache.dir这两个环境变量后的mvn命令(其他命令行参数保持不变),果然发现编译失败了。这就说明是这个依赖缓存引起本地pc打包master分支失败,aone却成功的现象。

进一步分析需要找出具体缓存的具体位置,dependency.graph.cache.dir参数已经告诉我们了缓存所在的目录。但我们还需要知道过多的信息。由于知道编译失败的是exchange的server模块,所以检查相关的maven日志,找到了如下的输出:

从红色框中的日志可以猜测,server模块的依赖缓存似乎是从e46bec54e7fbf366d0e02d16437ebb59_2.2.1这个文件读出来的。所以尝试在cache目录查找这个文件:

果然找到了文件。

结论

在依赖缓存文件中,看到引起本地编译失败的tp-client-base版本是3.4.3。而在master分支执行mvn dependency:tree命令输出的结果中,显示tp-client-base版本是1.8.91。

由于pom依赖没有发生修改,所以基本上可以肯定是由于某个snapshot的依赖发生了变化导致tp-client-base这个间接依赖的二方包的版本发生了变化。

找到原因之后,修改工程的pom,强制依赖tp-client-base:3.4.3版本,编译和打包都正常了。

由于是在编译期发现的问题,所以影响还不是很大。如果是在上线运行时出现由于snapshot包发生变化(可能是代码,也可能是依赖)而出现的失败,问题就会严重很多。如果上一个稳定版依赖的是相同的snapshot版本,回滚代码都没有用。只能通过修改代码中的依赖版本,重新发布解决。

依赖snapshot版本的风险和危害,由此可见一斑。

目录
相关文章
|
6月前
|
Java Maven
maven跳过测试清理、打包、安装
maven跳过测试清理、打包、安装
126 4
|
6月前
|
Java Maven
蓝易云 - Maven使用mvn命令时跳过test的参数
另外,还有一个参数 `-Dmaven.test.skip=true`也可以用来跳过测试,但是这个参数不仅跳过测试,还会跳过编译测试代码的阶段。所以,如果你的项目中有其他模块依赖测试代码,那么使用 `-Dmaven.test.skip=true`可能会导致构建失败。在大多数情况下,推荐使用 `-DskipTests`参数。
54 0
|
7月前
|
缓存 Java Maven
【Maven】工程依赖下载失败错误解决
【Maven】工程依赖下载失败错误解决
515 0
|
7月前
|
缓存 Java Maven
Maven中的SNAPSHOT版本和正式版本
Maven中的SNAPSHOT版本和正式版本
|
安全 Java Maven
最安全的maven下载方法,保证之后用起来不报错
最安全的maven下载方法,保证之后用起来不报错
204 0
最安全的maven下载方法,保证之后用起来不报错
|
Java Maven
Maven SNAPSHOT作用
Maven SNAPSHOT作用
189 0
|
IDE Java Maven
解决 Maven 执行Update project后 jdk版本变回1.5的问题
解决 Maven 执行Update project后 jdk版本变回1.5的问题
256 0
|
Java Maven 开发工具
Maven中使用<version>LATEST</version>自动依赖最新版本引发的问题
Maven中使用<version>LATEST</version>自动依赖最新版本引发的问题
454 0
|
Java Shell Maven
mac安装maven后mvn命令可用,一段时间后又遇到zsh: command not found: mvn的问题
mac安装maven后mvn命令可用,一段时间后又遇到zsh: command not found: mvn的问题
852 0
mac安装maven后mvn命令可用,一段时间后又遇到zsh: command not found: mvn的问题
|
Java Maven
下载历史版本的maven
下载历史版本的maven
下载历史版本的maven