前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >是谁,代码毒害我

是谁,代码毒害我

作者头像
Java3y
发布2023-09-22 14:53:14
1090
发布2023-09-22 14:53:14
举报
文章被收录于专栏:Java3yJava3y

大家好,我3y啊。本来我以为我平时在公司乱写代码,已经是一件很过分的事了。这两天遇到的问题,我觉得是真在代码里下毒,决定下班就回家写篇文章一吐不快。

不知道大家有没有听过「二方库」,首先来科普一下什么是二方库?

  • 一方库指的是本项目中的依赖
  • 二方库指的是公司内部其他项目提供的依赖
  • 三方库指的是其他组织、公司等来自第三方的依赖

我想象中的二方库:

  • 是公共的包。给各个系统去引用,这样就不用每个系统都写第二遍相同的逻辑。实际上在项目里,很多就是复制粘贴到多处,我他妈直接CV
  • 是版本控制和使用规范化。实际的使用场景,光一个log就有log4j log4j2 logback ,redis客户端光jedis就一堆版本,你升级了业务根本不升级。业务:我用得好好的,我升级个毛

OK,有了二方库的基础了以后,来介绍下我这两天遇到的奇葩事了。我这项目被maven管理,有十几个模块,其中xxx-common是一个二方库,xxx-service是主要的业务逻辑代码,这个项目都在同一个Git仓库下做代码版本控制。

最近因为调用外部接口的api要升级了,而外部接口的api的url是写在二方库xxx-common模块上。这本身是很合理的事,其他需要用到这个外部api的模块就不用在自己的系统上定义对应的url咯。

像这次升级的话,那只要改一处就好了,其他的模块只要引入新的二方库版本就OK咯,这很合理。

然而,我发现这个url被复制到处都是,一改就改了好几个模块。就比如像xxx-service 模块明明就有引入xxx-common模块,但它还是单独在系统上声明了url。

不过,这不是事,改起来很方便,现在ide太强大了,直接全局匹配出来,全局替换就完事了。

但是,为了后续好维护,我是想统一把这块抽取到xxx-common模块就可以了,后面就真的只改一处。然而,我发现了个事,各个模块依赖xxx-common的版本都不太一样

比如xxx-service依赖的xxx-common0.0.1版本,而xxx-service-v2依赖的xxx-common0.0.3版本,我隐约感觉到不对劲了,但我还是继续往下干。

显然,我肯定是基于现有xxx-common最新的版本的基础上去做改动的咯。整个项目的git仓库用的是master分支,我就理所当然地在master分支上修改xxx-common模块。

很快啊,我改完了,我把xxx-service依赖的xxx-common,升级到我新发的版本之后,发现项目压根就部署不起来。我一想,没理由啊,我就改了这么点东西,凭啥没有起来啊。就只是一个变量啊,大哥

看了半天,哦,原来xxx-common这个模块不是在master分支上改的,是由另外的分支去变更它的代码。你能理解吗,我是理解不了,你这样玩,你为啥在同一个Git仓库下管理啊!!!

这我忍了,我就切到对应的分支上去改吧。找出问题了以后,这也很快啊,我一会就搞掂了,于是我又重新打了个新的版本deploy在maven的仓库上,把xxx-service模块又重新部署起来。

阿欧,发现xxx-service模块又没起来,缺了别的java依赖。我又再次核对了下,分支是没错的,版本也是在xxx-service之前的所依赖的版本基础上改的,改动也就一个变量,这凭啥没起来啊!

怎么想都不对劲,后来我就去把我打的jar包跟上一个版本的jar包做了下对比(idea可以对比两个jar包的区别,又学到了些知识了)。

我发现,这差异不仅仅是我改的变量啊,还有好十几个类啊。这怎么解释呢?我能想到唯一的解释就是:上一个人把包发布到maven了,但是没有提交&推送(commint&push)代码

擦,这么狠毒啊!这怎么玩啊,花了我两天时间搞这个了,正常的需求我都还没做啊。原来可以这样在代码里下毒啊。

END

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-09-21 21:11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java3y 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档