避免依赖版本冲突?


10

几乎可以肯定,使用我的jar的任何Java项目都将对另一个jar附加依赖,我的jar也将其作为依赖项。

问题是,其他jar有多个版本。

在您项目的第二个jar版本与第二个jar版本不同的情况下,如何避免出现任何问题?

我不希望我的用户有多余的麻烦来做一些花哨的类加载技巧来添加我的jar。

我是否应该为该通用依赖项的每个可能版本制作一堆不同版本的jar?然后,您只需选择使用与您刚碰到的第二个jar版本相同的jar版本即可?

有没有更聪明的方式来处理此问题,并使人们更轻松地使用我的jar,而不会发生冲突?

Answers:


10

这不是你的问题。由您的最终用户解决。它只是伴随着使用第三方依赖项的领域,我不得不解决依赖项冲突的次数比我计算的要多。您不能期望容纳每个项目的特定依赖冲突。

您的软件应使用最新版本的依赖项正常运行。除非该依赖关系在每个发行版上都更改了其接口,否则您应该具有一定范围的兼容性(例如,您的软件适用于dep in range中的所有版本 [2.0.0, 3.0.0))。只要您要维护该软件,就应该尝试使其与所有依赖项的最新版本兼容。

就是说,作为开发人员,使用具有不同依赖版本的软件来使用您的软件,对于我来说,这是有用的。

  • 如果您的项目与另一个项目之间的集成紧密,则在文档中有一个兼容性表会很有帮助。无论如何,您应该在文档中提及依赖项的特定版本的任何已知问题。否则,开发人员必须通过反复试验找到兼容的版本。
  • 通过接口抽象与依赖关系的协作,并设计软件,以便可以用依赖关系注入替代实现。这样,作为最终用户,我就可以用库的版本x替换我自己的集成,而不会打扰您。
  • 有一个公共问题跟踪器,以便您的用户可以要求您支持某些版本的通用依赖项。如果发现许多用户希望支持该依赖项的不兼容版本,则可以为两者发布版本。请参阅此Maven示例,其中它们针对多个平台-对不同版本的依赖项的支持应该相似。

Java是否具有.NET中的程序集bindingRedirect App.config设置之类的东西,您可以在其中指定“请求依赖项的库Foo v3.0.2实际上应使用Foo v3.0.5并假装其为v3.0.2”?我已经有11年没有使用Java了,所以我对Java如何处理Java的记忆只是过去了。
John Zabroski
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.