Версия транзитивной зависимости 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
Другое решение состоит в том, чтобы выяснить, в какую именно жировую банку они входят, и посмотреть, сможете ли вы исключить ее из собственной жировой баночки.