关于使用maven打包war时多个依赖jar版本最佳实践的问题

A question about best practice on multiple dependency jar versions when packing war with maven

我有一个带有子模块的 Maven war 项目。一个模块使用 google-api-client,另一个使用 google-cloud-storage。我在下面画了一些它们的依赖关系

A
|-google-api-client:jar:1.33.1
  |-google-http-client-gson:jar:1.41.1

B
|-google-cloud-storage:jar:2.4.4
  |-google-api-client:jar:1.33.1
  |-google-http-client-gson:jar:1.41.2

打包war时,gson1.41.11.41.2都会被打包。我知道 Maven 有一个最近的规则来确定编译时使用哪个 jar。但是当网络服务器加载我的项目时,我无法控制首先加载哪个 jar。所以我只想为每个 jar 保留一个较新的版本。

我知道我可以在依赖中添加<exclusion>标签,添加一个新的依赖来告诉maven使用特定版本的jar。但是,我不确定这是否是最佳实践,因为它需要我检查第三方库的依赖项。实在是太多了。

关于如何正确处理多个版本的 jar 有什么建议吗?

我推荐的一个好习惯是使用 enforcer Plugin with dependency convergence goal。这样你就不得不决定哪个版本将在 class 路径上。当然这可能是额外的努力,因为你必须处理冲突(也通过设置排除),但最终它是明确定义的,你得到哪个版本。