java - 大公司如何解决包依赖冲突问题?
问题描述
如图,一个app(Java)引用了两个第三方包jar(packageA和packageB),分别引用了packageC-0.1和packageC-0.2。如果 packageC-0.2 与 packageC-0.1 兼容,它将运行良好。然而,有时 packageA 使用了 packageC-0.2 中不支持的东西,而 Maven 只能使用最新版本的 jar。这个问题也被称为“Jar Hell”。
在实践中重写包 A 或强制其开发人员将包 C 更新到 0.2 是很困难的。
你如何解决这些问题?这经常发生在大型公司中。
我必须声明这个问题主要发生在大公司,因为大公司有很多部门,每次某些开发人员使用新版本的新功能时让整个公司更新一个依赖项会非常昂贵。一些依赖罐子。这对小公司来说没什么大不了的。
任何回应将不胜感激。
让我扔掉一块砖头,先得到一颗宝石。
阿里巴巴是世界上最大的电子商务之一。我们通过创建一个名为 Pandora 的隔离容器来解决这些问题。它的原理很简单:将这些中间件打包在一起,用不同的ClassLoader加载它们,这样即使它们引用了不同版本的相同包,它们也能很好地协同工作。但这需要 Pandora 提供的运行时环境,它作为 tomcat 进程运行。不得不承认,这是一个沉重的计划。Pandora 是基于 JVM 通过类加载器加上类名来识别一个类这一事实而开发的。
如果您知道有人可能知道答案,请与他/她分享链接。
解决方案
我们是一家大公司,我们经常遇到这个问题。我们拥有跨越多个开发人员组的大型依赖树。我们所做的:
我们通过 jar 的维护者发布的“推荐版本”的 BOM(Maven 依赖管理列表)来管理版本。这样,我们确保使用最新版本的工件。
我们试图通过将开发人员组内部使用的功能与他们提供给其他组的功能分开来减少大型依赖树。
但我承认,我们仍在努力寻找更好的策略。我还要提一下,使用“微服务”是解决这个问题的一种策略,但在很多情况下,它对我们来说不是一个有效的策略(主要是因为我们不能再在数据库上进行全局事务了)。
推荐阅读
- python - 为什么 df.columns 是一个空列表,而如果我打印出数据框,我可以看到列名?蟒蛇熊猫
- python - 从容器内的 Python 脚本读取 Docker 容器外的 HDF 文件
- python - 如何将多个输入循环到字典文件 Wirth Python 中?
- discord.js - Discord.Js 在 + 后添加空格的问题
- python - 如何在 Django 中对 ListView 的 get_context_data() 进行单元测试?
- node.js - 我的笔记本电脑如何作为 Web 服务器工作,它将 24/7 全天候将数据传输到数据库
- javascript - 检查数组数组是否包含JavaScript中的另一个数组的最佳优化方法是什么?
- javascript - TypeError:无法读取 null 的属性“销毁”
- sql - 从 Postgres 表中选择列的最新值
- javascript - 如何使用 JS 从网站导入数据并在我的网页中使用?