Java运⾏期的jar版本冲突控制解决思路

解决思路:

⼀般来说,在⽐较⼤的项⽬⾥,依赖冲突这种事情⼏乎是⽆法避免的。⼀般来说,这种问题的解决⽅法⼤多是下⾯⼏种:

  1. 对于业务⽅来说,写代码的时候⼩⼼⼀点,遇到不同依赖的时候,有意识的检查⼀下依赖树,尽量使⽤较新的包,并且代码上线之前需要在测试环境充分测试。
  2. 对于组件开发⽅来说,在写接⼊⽂档的时候要同时指明依赖的包的最低版本号,清楚地告诉接⼊⽅最低的依赖,然后再由接⼊⽅⼿动指定。
  3. 使⽤Shade技术,对于组件开发⽅来:说,将需要依赖的第三⽅包shade进⾃

⼰的代码,使⽤“⾃⼰包名的前缀+实际包名”来进⾏隔离。

  1. 采⽤容器技术,⽐如OSGI、Jigsaw、Karaf这些容器,对jar包再进⾏⼀层权限控制。这是⼀种⼗分重量级的⽅法,⼀般项⽬得上了⼀定的规模才会使

⽤。

  1. 采⽤ClassLoader隔离技术,各个包都使⽤⾃⼰的classLoader,互相不影

响。这种⽅法其实很像是容器技术的阉割版,逻辑上很像容器,对jar包再做⼀层隔离控制。不过这种⽅式⼀般不是很优雅,有点像hack,因此⽬前看起来没什么像样的完整解决稍微像样点的⼤概就是阿最近搞的Sofa ark功能挺强但是起来也较复杂对jar包的侵⼊性也很强

各个⽅法其实都不是很⽅便,那就换⼀个思路,既然避免问题⽐较困难,那就尽量早点暴露问题。编译错误或者启动错误肯定会⽐运⾏时不知道啥时候报错更让⼈放⼼。因此根据 fail fast 原则,我们应当保证在不增加沟通成本的情况下,快速暴露问题。分析

既然很多依赖冲突问题在编译、打包时都不会报错,那就只能尽量在启动时报错了。因此对于⼀个稳定的组件来说,做⼀个运⾏时的启动检查也就有⼀定的合理性了。

为了能在运⾏时进⾏依赖检查,肯定要想办法在运⾏时获得某个包的版本号。那如何在打包时把版本信息写在jar包⾥,然后再读出来呢?这就要从JarFile的加载说起了。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值