我与传递依赖有冲突。覆盖,排除或强制无济于事。我还能做些什么来将正确的库版本放入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)
与配置库的过时版本how to resolve NoSuchMethodError on typesafe config?相关。 也通过以下方式确认:
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 https://stackoverflow.com/questions/40610816/how-to-resolve-nosuchmethoderror-on-typesafe-config'
}
}
implementation('com.typesafe:config:1.3.3') {
force = true
}
或者喜欢:
configurations.all {
resolutionStrategy {
force 'com.typesafe:config:1.3.3'
}
}
没有给出正确的版本。
所有变体都失败并出现相同的错误
有什么问题?必须有一种强制所需版本的方法。
答案 0 :(得分:2)
你遇到的问题与你所描述的完全相反。
您在项目中尝试的不同内容都确保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
的版本
另一个解决方案是找出哪些脂肪罐包含这些,并看看你是否可以将它从你自己的脂肪罐中排除。