4

推移的な依存関係と競合しています。オーバーライド、除外、または強制は役に立ちません。適切なバージョンのライブラリを 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'
    }
}

正しいバージョンを提供しません。

結果

すべてのバリアントが同じエラーで失敗します

なにが問題ですか?目的のバージョンを強制する方法が必要です。

4

1 に答える 1

2

あなたが抱えている問題は、あなたが説明しているものとは正反対です。

プロジェクトで試したさまざまなことはすべて、のバージョンcom.typesafe:config1.3.x.

ただし、追加するときに、行からorg.locationtech.geomesa:geomesa-hbase-spark-runtime_2.11:2.0.1のクラスが既にある依存関係を取り込みます。そして、ファット jar を作成すると、そのバージョンがその行のクラスを上書きします。com.typesafe:config1.21.3

これは、fat jar を解凍して実行することで確認できます。

$ 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

もう 1 つの解決策は、どのファット jar にこれらが含まれているかを正確に調べて、自分のファット jar から除外できるかどうかを確認することです。

于 2018-05-30T16:57:41.750 に答える