gradle 传递依赖的强制版本不起作用。似乎没有排除、覆盖或强制适用
gradle force version of transitive dependency not working. No exclude, override or force seems to apply
我与传递依赖有冲突。覆盖、排除或强制都无济于事。我还能做些什么来将正确版本的库放入 jar 中?
完整的代码就可以了。找到了 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"
}
并执行 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)
这与配置库的过时版本有关,。
还通过以下方式确认:
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 再次失败并出现同样的问题。
implementation("com.typesafe:config")
constraints {
implementation("com.typesafe:config:1.3.3") {
because 'previous versions miss a method
}
}
implementation('com.typesafe:config:1.3.3') {
force = true
}
或喜欢:
configurations.all {
resolutionStrategy {
force 'com.typesafe:config:1.3.3'
}
}
没有给出正确的版本。
结果
所有变体都因相同的错误而失败
怎么了?必须有一种方法来强制使用所需的版本。
您遇到的问题与您描述的完全相反。
您在项目中尝试的不同操作都确保 com.typesafe:config
的版本是 1.3.x
。
但是,当添加 org.locationtech.geomesa:geomesa-hbase-spark-runtime_2.11:2.0.1
时,您从 com.typesafe:config
中引入了一些已经具有 类 的依赖项,但来自 1.2
行。当您创建 fat jar 时,该版本会覆盖 1.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
的版本
另一种解决方案是找出究竟是哪个 fat jar 包含这些,看看是否可以将其从您自己的 fat jar 中排除。
我与传递依赖有冲突。覆盖、排除或强制都无济于事。我还能做些什么来将正确版本的库放入 jar 中? 完整的代码就可以了。找到了 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"
}
并执行 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)
这与配置库的过时版本有关,
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 再次失败并出现同样的问题。
implementation("com.typesafe:config")
constraints {
implementation("com.typesafe:config:1.3.3") {
because 'previous versions miss a method
}
}
implementation('com.typesafe:config:1.3.3') {
force = true
}
或喜欢:
configurations.all {
resolutionStrategy {
force 'com.typesafe:config:1.3.3'
}
}
没有给出正确的版本。
结果
所有变体都因相同的错误而失败
怎么了?必须有一种方法来强制使用所需的版本。
您遇到的问题与您描述的完全相反。
您在项目中尝试的不同操作都确保 com.typesafe:config
的版本是 1.3.x
。
但是,当添加 org.locationtech.geomesa:geomesa-hbase-spark-runtime_2.11:2.0.1
时,您从 com.typesafe:config
中引入了一些已经具有 类 的依赖项,但来自 1.2
行。当您创建 fat jar 时,该版本会覆盖 1.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
另一种解决方案是找出究竟是哪个 fat jar 包含这些,看看是否可以将其从您自己的 fat jar 中排除。