Java Maven项目中的库版本冲突
在构建具有许多依赖项的Maven项目时,其中一些依赖项依赖于同一库,但使用的版本不同,这会在运行应用程序时导致错误。
例如,如果我添加两个不同的项目依赖项,A和B都依赖于apachecommonshttp客户端,但每个依赖于不同版本,则一旦类加载器加载了A的apachecommons http客户端类,B就会尝试使用它们,因为它们已经由类加载器加载。
但是B的字节码取决于所加载类的不同版本,从而在运行应用程序时引起多个问题。一个常见的方法是methodnotfound异常(因为A的http客户端版本不再使用特定的方法)。
建立避免此类冲突的总体策略是什么?是否需要手动检查依赖关系树以找出哪些公共库相互冲突?
回答:
欢迎来到maven依赖地狱,众所周知。随着项目的发展和引入更多的外部依赖关系,这在某种程度上是一个普遍的问题。
除了Apache Commons(在您的原始问题中提到)外,日志记录框架(log4j,slf4j)是另一个常见的元凶。
我同意“席子”提出的关于一旦解决冲突就如何解决冲突的建议。在及早发现这些版本冲突方面,您还可以使用maven“ enforcer”插件。请参阅“
dependencyConvergence”配置。
使用强制实施程序插件将在版本冲突时立即使构建失败,从而使您免于手动检查。这是一种激进的策略,但是可以防止提示您问题/帖子的运行时问题类型。像其他任何东西一样,强制执行器插件也有其优点和缺点。我们在去年开始使用它,但是后来发现它既是福也是祸。许多版本的lib
/
frameworks是向后兼容的,因此在编译时和运行时都可以(直接或间接)依赖1.2.3和1.2.4两个版本。但是,强制执行程序插件将标记此冲突,并要求您准确声明所需的版本。假设依赖性冲突的数量很少,那么这不需要太多工作。但是,一旦引入了大型框架(例如SpringMVC),它就会变得讨厌。
希望这是有用的信息。
以上是 Java Maven项目中的库版本冲突 的全部内容, 来源链接: utcz.com/qa/399229.html