H2O.ai h2o-genmodel.jar包含sl4j绑定

时间:2018-06-07 20:10:18

标签: java maven machine-learning dependencies h2o

使用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而不是更好)?

2 个答案:

答案 0 :(得分:0)

h2o-genmodel这是一种pom类型的依赖。这意味着您将其用作多个依赖项的聚合器,以使您的生活更轻松。您的问题源于ai.h2o:deepwater-backend-api:jar:1.0.4的{​​{1}}依赖关系对h2o-genmodel具有短暂依赖性的事实。您可以使用依赖项maven插件调试依赖关系层次结构,运行以下命令:

org.slf4j:slf4j-log4j12:jar:1.7.5

要解决此问题,您可以从> 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 依赖项中排除slf4j-log4j12依赖项:

h2o-genmodel

您可以再次运行maven dependency tree命令来检查剩余的slf4j绑定数量。

因为错误引发了多个slf4j绑定,所以我假设一旦确定依赖树中只有一个slf4j绑定,一切都会在运行时完成。

更新:

详细说明此解决方案的工作原理:
首先, <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> 依赖项被声明为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不遵循建议的方式来包装依赖项,因为它不使用ai.h2o:h2o-genmodel,而是使用<dependencyManagement>。因此,maven文档的详细信息并不完全符合预期。要解决此问题,您必须在<dependencies>上明确使用ai.h2o:h2o-genmodel并手动调整其后面的每个依赖项的范围。我强烈建议运行<dependencies>,因为它将显示每个依赖项的范围。在我的输出中,我删除了范围,因为我不想让它来回答问题。

总之,为什么在我的解决方案中使用声明为pom的依赖项和@ kag0而不是pom是因为mvn dependency:tree是pom类型而maven以相同的方式处理它,因为ai.h2o:h2o-genmodel缺少它从人工制品pom中推断出来。

答案 1 :(得分:0)

所以这最终成为一个太仓促的案例,无法发布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>