H2O.ai h2o-genmodel.jar содержит связывание sl4j - PullRequest
0 голосов
/ 07 июня 2018

При использовании 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 и удаление зависимостей изнутри кувшина вручную.

Есть ли какой-нибудь лучший способ использовать h2o modelgen без необходимости вручную связываться с внутренним пространством кувшина (вместо этого предпочтительнее было бы использовать maven)?

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Так что это оказалось слишком поспешным для публикации на 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>
0 голосов
/ 08 июня 2018

h2o-genmodel это зависимость типа pom.Это означает, что вы используете его как агрегатор для нескольких зависимостей, чтобы сделать вашу жизнь проще.Ваша проблема возникает из-за того, что ai.h2o:deepwater-backend-api:jar:1.0.4 зависимость h2o-genmodel имеет временную зависимость от 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 следующим образом:

    <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, потому что этокак это опубликовано.Maven-артефакт типа pom используется в двух случаях: как агрегатор для подмодулей или как агрегатор для зависимостей.В этом случае тип pom используется во втором сценарии, чтобы упаковать зависимости для ai.h2o:h2o-genmodel.Чтобы изменить это, вы можете проверить свой локальный репозиторий maven (скорее всего, в $ {user.home} /. M2 / repository / ai / h2o / h2o-genmodel / 3.18.0.11 нет файла jar, только .pom. Пожалуйстапрочитайте эту документацию Введение в механизм зависимостей и Отношения POM

Другая проблема, возможно, заключается в том, что ai.h2o:h2o-genmodel не придерживается рекомендованного способа переноса зависимостейпотому что он не использует <dependencyManagement>, а вместо этого использует <dependencies>. Из-за этого детали документации maven не работают точно так, как ожидалось. Чтобы преодолеть это, вы должны явно использовать ai.h2o:h2o-genmodel для <dependencies>и вручную откорректируйте область действия каждой зависимости. Я настоятельно рекомендую запустить mvn dependency:tree, потому что будет отображаться область действия каждой зависимости. В своем выводе я удалил области действия, потому что не хотел, чтобы он получил ответ.

В заключение, почему в моем решении работает с зависимостью, объявленной как pom, а в @ kag0 не как pom, потому что ai.h2o:h2o-genmodel относится к типу pom и maven Treatэто так же, потому что, когда <type> отсутствует, это выводит его из помпона артефакта.

...