【问题标题】:Multiple jars of same groupId and artifactId in WEB-INFWEB-INF 中相同 groupId 和 artifactId 的多个 jar
【发布时间】:2018-07-06 07:49:42
【问题描述】:

我正在使用 maven 版本 3.5.3,并且在构建我的项目时,我在 WEB-INF 中获得了两个版本的 apache commons-lang3v3.1 和 v3.4 )即使我在父 pom.xml 的“dependency-management”中明确指定了 v.3.4。

两者都有相同的 groupId 和 artifactId。

我很困惑。这是 Maven 的预期行为吗?在什么情况下会发生这种情况?我的印象是,如果依赖项具有相同的 groupId 和 artifactId,maven 会将所有依赖项解析为一个 jar。

【问题讨论】:

  • v3.1 是通过从特定参考间接引用而来的。在某些 IDE 上,您有可能看到整个“依赖层次结构”。或者通过提示你可以运行'mvn dependency:tree'来查看它有没有对v3.1的引用

标签: java maven dependencies dependency-management


【解决方案1】:

我很困惑。这是 Maven 的预期行为吗?根据什么 这种情况会发生吗?我的印象是maven 如果依赖项相同,则将所有依赖项解析为一个 jar groupId 和 artifactId。

Maven 确实如此。
对于相同的 groupId 和相同的 artifactId,Maven 打包目标的默认行为是只打包它们的一个版本。请注意,如果有多个版本可用,Maven 选择的版本并不是真正可预测的。

我想,有时您的构建会从 jar 手动复制到 WEB-INF 文件夹(例如通过 Maven 插件),或者您的 pom(或其父级)指定 overlay in the WAR

mvn dependency:tree 命令应该可以帮助您了解引用或提取不同版本的位置。

【讨论】:

  • 我认为手动复制或覆盖可能是问题所在。你能指出一些这样做的案例或插件吗?
  • 你是对的。 Maven Surefire 插件带来了 commons-lang3 3.1 版。由于依赖管理不解决插件依赖关系,因此必须在父 pom 的 pluginManagement 中指定所需的版本。
  • 但令我惊讶的是它是由插件添加的。 Maven Surefire 插件依赖项永远不必包含在打包的组件中。请提供更多细节。
  • 更新:@davidxxx 你是对的,这不是因为插件而是战争覆盖
【解决方案2】:

当构建没有“干净”完成时,我多次看到这个问题,即使用package 而不是clean package。在这种情况下,您可能会混合使用旧版本和最新版本。

【讨论】:

  • 我总是使用“干净包”或“干净安装”。也尝试删除 lib 存储库和 .m2,但没有任何区别。
猜你喜欢
  • 2020-03-11
  • 2017-12-02
  • 2018-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-10
  • 2020-12-09
  • 1970-01-01
相关资源
最近更新 更多