【问题标题】:H2O.ai h2o-genmodel.jar contains sl4j bindingH2O.ai h2o-genmodel.jar 包含 sl4j 绑定
【发布时间】:2018-11-17 20:32:15
【问题描述】:

当使用h2o-genmodel.jar(来自maven central或生成mojo时输出)时,SLF4j会报错

SLF4J:类路径包含多个 SLF4J 绑定
SLF4J:在 [jar:file:~/.ivy2/cache/org.slf4j/slf4j-log4j12/jars/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class] 中找到绑定]
SLF4J:请参阅http://www.slf4j.org/codes.html#multiple_bindings 以获得解释。

使用 maven 或 SBT 的传递依赖排除不起作用,所以现在我将 jar 输出与 mojo 一起使用并手动从 jar 中删除依赖项。

有没有更好的方法来使用 h2o modelgen 而不必手动弄乱 jar 的内部(最好使用 maven 代替)?

【问题讨论】:

    标签: java maven machine-learning dependencies h2o


    【解决方案1】:

    h2o-genmodel 这是一个 pom 类型的依赖。这意味着您将其用作多个依赖项的聚合器,以使您的生活更轻松。您的问题源于h2o-genmodelai.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 MechanismPOM Relationships

    另一个问题,可能是ai.h2o:h2o-genmodel 不遵循推荐的包装依赖项的方式,因为它不使用&lt;dependencyManagement&gt;,而是使用&lt;dependencies&gt;。因此,有关 Maven 文档的详细信息并没有完全按预期工作。为了克服这个问题,您必须在&lt;dependencies&gt; 上显式使用ai.h2o:h2o-genmodel 并手动调整其背后的每个依赖项的范围。我强烈建议运行mvn dependency:tree,因为它将显示每个依赖项的范围。在我的输出中,我删除了范围,因为我不希望它污染答案。

    总之,为什么在我的解决方案中使用声明为 pom 而在 @kag0 中不是作为 pom 的依赖项是因为 ai.h2o:h2o-genmodel 是 pom 类型,而 maven 以同样的方式对待它,因为当 &lt;type&gt; 丢失时它推断它来自人工制品 pom。

    【讨论】:

      【解决方案2】:

      所以这最终是一个过于仓促而无法在 SO 上发布的案例

      使用 maven 或 SBT 的传递依赖排除不起作用

      最终不是真的。我只需要再刷新一次 SBT。

      我会留下这个问题以供参考。 mvnrepository.com 可能表明这是一个 pom 依赖项,您应该包含类似

      的依赖项
      libraryDependencies += "ai.h2o" % "h2o-genmodel" % "3.18.0.11" % "runtime" pomOnly()
      

      <dependency>
          <groupId>ai.h2o</groupId>
          <artifactId>h2o-genmodel</artifactId>
          <version>3.18.0.11</version>
          <type>pom</type>
          <scope>runtime</scope>
      </dependency>
      

      但从实验看来,这不起作用,hex.genmodel... 包将不可用

      要让依赖项工作而不是拉入你应该使用的 slf4j 绑定

      libraryDependencies += "ai.h2o" % "h2o-genmodel" % "3.18.0.11" exclude("org.slf4j", "slf4j-log4j12")
      

      <dependency>
          <groupId>ai.h2o</groupId>
          <artifactId>h2o-genmodel</artifactId>
          <version>3.18.0.11</version>
          <exclusions>
              <exclusion>
                  <groupId>org.slf4j</groupId>
                  <artifactId>slf4j-log4j12</artifactId>
              </exclusion>
          </exclusions>
      </dependency>
      

      【讨论】:

      • 你的答案和我的有什么不同?
      • @catta 如果包含&lt;type&gt;pom&lt;/type&gt;,则hex.genmodel 包将不可用。如果您想更新您的答案,解释为什么它被标记(可能是错误的?)作为 pom 类型依赖项,我会将其标记为正确。
      猜你喜欢
      • 1970-01-01
      • 2017-12-03
      • 2018-02-20
      • 2017-10-02
      • 2018-11-04
      • 1970-01-01
      • 2017-10-21
      • 2016-02-06
      • 2018-06-07
      相关资源
      最近更新 更多