论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版本的风险和危害,由此可见一斑。

目录
相关文章
|
网络协议
【开源视频联动物联网平台】J2mod库对指令码的定义
【开源视频联动物联网平台】J2mod库对指令码的定义
416 1
|
Java 应用服务中间件 微服务
spring boot 中Feign调用提示Request header is too large 解决方案
spring boot 中Feign调用提示Request header is too large 解决方案
1055 1
|
消息中间件 运维 算法
Kafka 为什么要抛弃 Zookeeper?
本文探讨了Kafka为何逐步淘汰ZooKeeper。长久以来,ZooKeeper作为Kafka的核心组件,负责集群管理和协调任务。然而,随着Kafka的发展,ZooKeeper带来的复杂性增加、性能瓶颈及一致性问题日益凸显。为解决这些问题,Kafka引入了KRaft,这是一种基于Raft算法的内置元数据管理方案,不仅简化了部署流程,还提升了系统的一致性和扩展性。本文详细分析了这一转变背后的原因及其带来的优势,并展望了Kafka未来的发展方向。
824 1
|
监控 安全 数据可视化
Grafana 安全性和权限管理
【8月更文第29天】Grafana 是一个广泛使用的开源平台,用于可视化和监控时间序列数据。随着 Grafana 在生产环境中的广泛采用,确保其安全性变得至关重要。本文将探讨如何配置 Grafana 的访问控制和安全设置以保护敏感数据,并提供一些具体的代码示例。
1831 3
|
Linux 网络安全 调度
DolphinScheduler 调度工作流报错 Host key verification failed.
DolphinScheduler调度任务失败,错误显示"Host key verification failed."。问题可能在于SSH免密登录配置失效或租户不存在于Linux系统中。解决方案:检查SSH配置并确保调度用户有管理员权限;确认DolphinScheduler租户与Linux用户对应。如果日志仅显示主机键验证失败,可能忽略了租户与操作系统用户的对应关系。创建具备管理员权限的新租户可解决。此外,当失败策略设为"继续"时,可能无法查看失败日志,建议使用"结束"策略。
475 0
|
Java Linux Go
知识分享之Golang——在Golang中unicode码和中文的互相转换函数
知识分享之Golang篇是我在日常使用Golang时学习到的各种各样的知识的记录,将其整理出来以文章的形式分享给大家,来进行共同学习。欢迎大家进行持续关注。 知识分享系列目前包含Java、Golang、Linux、Docker等等。
758 0
知识分享之Golang——在Golang中unicode码和中文的互相转换函数
|
安全 算法 关系型数据库
线程安全--深入探究线程等待机制和死锁问题
线程安全--深入探究线程等待机制和死锁问题
473 1
|
机器学习/深度学习 人工智能 分布式计算
Java中的机器学习模型集成与训练
Java中的机器学习模型集成与训练
|
Java Apache Maven
mvnd 安装和配置
mvnd 安装和配置
887 0
mvnd 安装和配置
|
Java 测试技术
java.lang.IllegalStateException Unable to find a @SpringBootConfiguration代码报错
java.lang.IllegalStateException Unable to find a @SpringBootConfiguration代码报错