首页 > 解决方案 > 大公司如何解决包依赖冲突问题?

问题描述

在此处输入图像描述 如图,一个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 通过类加载器加上类名来识别一个类这一事实而开发的。

如果您知道有人可能知道答案,请与他/她分享链接。

标签: javamavenclassloaderdependency-management

解决方案


我们是一家大公司,我们经常遇到这个问题。我们拥有跨越多个开发人员组的大型依赖树。我们所做的:

  • 我们通过 jar 的维护者发布的“推荐版本”的 BOM(Maven 依赖管理列表)来管理版本。这样,我们确保使用最新版本的工件。

  • 我们试图通过将开发人员组内部使用的功能与他们提供给其他组的功能分开来减少大型依赖树。

但我承认,我们仍在努力寻找更好的策略。我还要提一下,使用“微服务”是解决这个问题的一种策略,但在很多情况下,它对我们来说不是一个有效的策略(主要是因为我们不能再在数据库上进行全局事务了)。


推荐阅读