当前位置: 首页 > 知识库问答 >
问题:

Gradle强制版本的传递依赖不工作。排除、推翻或强制似乎都不适用

狄海
2023-03-14

我与传递依赖有冲突。压倒一切、排除或强迫都无济于事。我还能做什么来把正确版本的库放入罐子?完整的代码dan be。发现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)

这与配置库的过时版本有关,如何解决typesafe配置上的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'
    }
}

没有给出正确的版本。

所有变体都会以相同的错误失败

什么是错的?必须有一种方法来强制期望的版本。

共有1个答案

左翰海
2023-03-14

你遇到的问题和你描述的完全相反。

您在项目中尝试的不同东西都确保com.typesafe: config的版本是1.3. x

但是,当添加org时。定位技术。geomesa:geomesa-hbase-spark-runtime_2.11:2.0.1您引入了一些依赖项,这些依赖项已经包含com中的类。typesafe:config但从1.2行开始。当您创建fat jar时,该版本将覆盖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

另一个解决方案是找出到底是哪个脂肪罐包含了这些,看看你是否能从你自己的脂肪罐中排除它。

 类似资料:
  • 我无法使用Gradle强制生成依赖项的版本。我的目标是使用0.20.0版本。发布了Spring HATEOAS库的,但尽管我付出了所有的努力,它仍然解析为0.19.0。释放。 我尝试了许多策略,包括孤立的策略和相互结合的策略。这些策略包括但可能不限于以下策略(请注意,在所有情况下都在文件中定义,该文件位于声明Spring HATEOAS依赖项的模块目录的父目录中): #1(在声明依赖关系的模块的b

  • 一些stackoverflow帖子暗示我的类路径中有spring-asm的冲突版本。通过gradle依赖分析,我看到我没有spring-asm的多个版本,但我有spring-core的多个版本(版本3.1.4和5.0.2) 我试图排除3.1.4版本,但无法使其工作。我试图在依赖级别和配置级别都排除它。 即使有了上述更改,我仍然在依赖分析输出中发现Spring-Core:3.1.4.Release。

  • 渐变-泊坞插件和Spring靴版本 2.0.0.M4 M4 使用较新的客户端,并且使用 docker 插件以异常结尾,存在一个问题: 我的主项目中的构建脚本: 如您所见,我们加载spring-boot-gradle-plugin version=2.0.0。M4及其所有依赖项。 我的子项目构建:gradle: 最重要的是,docker.gradle文件与子项目的build.gradle文件位于同一

  • 问题内容: 我使用以下两个依赖项: 两者必须为同一版本才能正常工作。由于我的其他依赖项使用更高的版本,因此Gradle为每个依赖项使用不同的版本。 我通过运行发现了这一点: 如何强制Gradle为这两个依赖项设置相同的版本? 问题答案: 您的依赖项之一是强制更新番石榴版本。使用以定位库驱逐你的版本。 您遇到的问题是,如果您强迫它使用14.0.1,则另一个库可能无法正常工作。您是否可以仅使用17.0

  • 我使用以下两个依赖项: 两者必须是相同的版本才能正常工作。由于我的其他依赖项使用更高的版本,Gradle为每个依赖项使用不同的版本。 我通过运行找到了这一点: 如何强制Gradle为这两个依赖项设置相同的版本?

  • 在php 5.1中, 扩展之间的内部依赖是可以强制性的. 由于扩展可以静态构建到php中, 也可以构建为共享对象动态加载, 因此强制依赖需要在两个地方实现. 配置时模块依赖 第一个位置是你在本章课程中刚刚看到的config.m4文件中. 你可以使用PHP_ADD_EXTENSION_DEP(extname, depname[ , optional])宏标识extname这个扩展依赖于depname