推移的な依存関係と競合しています。オーバーライド、除外、または強制は役に立ちません。適切なバージョンのライブラリを jar に入れるには、他に何ができますか? 完全なコードはありません。https://github.com/geoHeil/gradle-dependency-resolutionが見つかりましたが、その主要部分を以下に説明します。
問題の説明
実行中
./gradlew shadowJar
geomesa の依存関係 (タイプセーフ/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"
}
そしてjarを実行する
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'
}
jar を再実行すると、同じ問題で再び失敗します。
また、次のような制約https://docs.gradle.org/current/userguide/managing_transitive_dependencies.html#sec:dependency_constraints :
implementation("com.typesafe:config")
constraints {
implementation("com.typesafe:config:1.3.3") {
because 'previous versions miss a method https://stackoverflow.com/questions/40610816/how-to-resolve-nosuchmethoderror-on-typesafe-config'
}
}
またはhttps://docs.gradle.org/current/userguide/managing_transitive_dependencies.html#sec:enforcing_dependency_versionのような力を使用する:
implementation('com.typesafe:config:1.3.3') {
force = true
}
または好き:
configurations.all {
resolutionStrategy {
force 'com.typesafe:config:1.3.3'
}
}
正しいバージョンを提供しません。
結果
すべてのバリアントが同じエラーで失敗します
なにが問題ですか?目的のバージョンを強制する方法が必要です。