使用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而不是更好)?
答案 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 Mechanism和POM 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>