Версия транзитивной зависимости gradle force не работает. Кажется, не применяется исключение, переопределение или форсирование

У меня конфликт с переходной зависимостью. Переопределение, исключение или форсирование не помогают. Что еще я могу сделать, чтобы получить правильную версию библиотеки в банку? Полный код может быть. найдено https://github.com/geoHeil/gradle-dependency-resolution но основные его части описаны ниже.

описание проблемы

проведение

./gradlew shadowJar

с зависимостями geomesa (которые используют устаревшую версию библиотеки типов typesafe / lightbend) отключены:

dependencies {

    compile "com.github.kxbmap:configs_2.11:0.4.4"
    //compile "org.locationtech.geomesa:geomesa-hbase-spark-runtime_2.11:2.0.1"
}

и выполнение банку

java -jar build/libs/gradleThing-all.jar                         

выходы

hello
my config is: Success(Job1Configuration(frequencyCounting))

При включении зависимостей:

./gradlew shadowJar
java -jar build/libs/gradleThing-all.jar                         

это терпит неудачу с

hello
Exception in thread "main" java.lang.Exception: Failed to start. There is a problem with the configuration: Vector([extract] com.typesafe.config.Config.hasPathOrNull(Ljava/lang/String;)Z)

которая связана с устаревшей версией библиотеки конфигурации, как разрешить NoSuchMethodError в типах безопасной конфигурации?, Также подтверждено через:

gradle dependencyInsight --dependency om.typesafe:config

> Task :dependencyInsight
com.typesafe:config:1.3.1 (conflict resolution)
   variant "runtime" [
      Requested attributes not found in the selected variant:
         org.gradle.usage = java-api
   ]
\--- com.github.kxbmap:configs_2.11:0.4.4
     \--- compileClasspath

com.typesafe:config:1.2.1 -> 1.3.1
   variant "runtime" [
      Requested attributes not found in the selected variant:
         org.gradle.usage = java-api
   ]
+--- org.locationtech.geomesa:geomesa-convert-avro_2.11:2.0.1
|    \--- org.locationtech.geomesa:geomesa-convert-all_2.11:2.0.1
|         +--- org.locationtech.geomesa:geomesa-tools_2.11:2.0.1
|         |    \--- org.locationtech.geomesa:geomesa-hbase-spark-runtime_2.11:2.0.1
|         |         \--- compileClasspath
...

Как я могу исправить транзитивную зависимость от желаемой версии 1.3.3?

мои решения

Попытка установить:

compile("org.locationtech.geomesa:geomesa-hbase-spark-runtime_2.11:2.0.1") {
                exclude group: 'com.typesafe', module: 'config'
            }

и снова запустить банку не удается с той же проблемой.

Также есть ограничение https://docs.gradle.org/current/userguide/managing_transitive_dependencies.html, например:

implementation("com.typesafe:config")
    constraints {
        implementation("com.typesafe:config:1.3.3") {
            because 'previous versions miss a method https://stackru.com/questions/40610816/how-to-resolve-nosuchmethoderror-on-typesafe-config'
        }
    }

или с использованием силы https://docs.gradle.org/current/userguide/managing_transitive_dependencies.html, например:

implementation('com.typesafe:config:1.3.3') {
        force = true
    }

или как:

configurations.all {
    resolutionStrategy {
        force 'com.typesafe:config:1.3.3'
    }
}

не дает правильную версию.

результат

Все варианты терпят неудачу с одной и той же ошибкой

Что случилось? Должен быть способ заставить нужную версию.

1 ответ

Решение

Проблема, которую вы имеете, является полной противоположностью того, что вы описываете.

Разные вещи, которые вы пробовали в своем проекте, все должны убедиться, что версия com.typesafe:config это 1.3.x,

Однако при добавлении org.locationtech.geomesa:geomesa-hbase-spark-runtime_2.11:2.0.1 вы получаете некоторую зависимость, которая уже имеет классы из com.typesafe:config но из 1.2 линия. И когда вы создаете свой толстый сосуд, эта версия перезаписывает классы из 1.3 линия.

Это можно увидеть, распаковав жирную банку и запустив:

$ javap com/typesafe/config/Config.class | grep hasPath
  public abstract boolean hasPath(java.lang.String);

показывая, что действительно hasPathOrNull метод отсутствует.

Эта проблема с затенением упоминается в https://issues.apache.org/jira/browse/SPARK-9441.

Учитывая это, легкий путь - если возможно для вас - будет понизить "com.github.kxbmap:configs_2.11 к версии, которая опирается на com.typesafe:config:1.2.x

Другое решение состоит в том, чтобы выяснить, в какую именно жировую банку они входят, и посмотреть, сможете ли вы исключить ее из собственной жировой баночки.

Другие вопросы по тегам