h2o-genmodel 这是一个 pom 类型的依赖。这意味着您将其用作多个依赖项的聚合器,以使您的生活更轻松。您的问题源于h2o-genmodel 的ai.h2o:deepwater-backend-api:jar:1.0.4 依赖关系对org.slf4j:slf4j-log4j12:jar:1.7.5 具有临时依赖关系。您可以使用依赖maven插件调试依赖层次结构,运行以下命令:
> mvn dependency:tree
...
[INFO] \- ai.h2o:h2o-genmodel:pom:3.18.0.11
[INFO] +- net.sf.opencsv:opencsv:jar:2.3
[INFO] +- com.google.code.gson:gson:jar:2.6.2
[INFO] +- com.google.protobuf.nano:protobuf-javanano:jar:3.1.0
[INFO] \- ai.h2o:deepwater-backend-api:jar:1.0.4
[INFO] \- org.slf4j:slf4j-log4j12:jar:1.7.5
[INFO] +- org.slf4j:slf4j-api:jar:1.7.5
[INFO] \- log4j:log4j:jar:1.2.17
要解决此问题,您可以使用以下命令从 h2o-genmodel 依赖项中排除 slf4j-log4j12 依赖项:
<dependency>
<groupId>ai.h2o</groupId>
<artifactId>h2o-genmodel</artifactId>
<version>3.18.0.11</version>
<type>pom</type>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
您可以再次运行 maven 依赖树命令来检查剩余多少 slf4j 绑定。
因为错误抱怨多个 slf4j 绑定,我假设一旦您确保依赖关系树中只有一个 slf4j 绑定,运行时一切都会好起来的。
更新:
更多详细信息为什么这个解决方案有效:
首先,ai.h2o:h2o-genmodel 依赖被声明为 pom 类型,因为它是这样发布的。 pom 类型的 maven artefact 用于两种情况:作为子模块的聚合器或作为依赖项的聚合器。在这种情况下,在第二种情况下使用 pom 类型,以打包 ai.h2o:h2o-genmodel 的依赖项。为了验证这一点,您可以检查您的 maven 本地存储库(很可能在 ${user.home}/.m2/repository/ai/h2o/h2o-genmodel/3.18.0.11 没有 jar 文件,只有 .pom。请阅读本文档Introduction to the Dependency Mechanism和POM Relationships
另一个问题,可能是ai.h2o:h2o-genmodel 不遵循推荐的包装依赖项的方式,因为它不使用<dependencyManagement>,而是使用<dependencies>。因此,有关 Maven 文档的详细信息并没有完全按预期工作。为了克服这个问题,您必须在<dependencies> 上显式使用ai.h2o:h2o-genmodel 并手动调整其背后的每个依赖项的范围。我强烈建议运行mvn dependency:tree,因为它将显示每个依赖项的范围。在我的输出中,我删除了范围,因为我不希望它污染答案。
总之,为什么在我的解决方案中使用声明为 pom 而在 @kag0 中不是作为 pom 的依赖项是因为 ai.h2o:h2o-genmodel 是 pom 类型,而 maven 以同样的方式对待它,因为当 <type> 丢失时它推断它来自人工制品 pom。