如果来自 2 个不同的包,如何强制 gradle 依赖项中的约束

问题描述 投票:0回答:1

我试图在 gradle 中强制执行一些依赖项,但我很难完成这项工作。

我阅读了文档并尝试了以下操作: https://docs.gradle.org/current/userguide/dependency_management.html#controlling_transitive_dependency

构建.gradle:

dependencies {
    implementation (group: 'com.google.protobuf', name: 'protobuf-java-util', version: '3.19.4')
    constraints {
        implementation('com.google.code.gson:gson-2.8.9')
    }

    implementation (group: 'io.confluent', name: 'kafka-connect-s3', version: '5.5.7')
    constraints {
        implementation('com.google.code.gson:gson-2.8.9')
        implementation('org.apache.hadoop:hadoop-common-3.3.1')
    }

但是当我检查依赖项时,这完全被忽略了。 在这种情况下,我如何才能强制使用 2.8.9

$ ./gradlew -q dependencyInsight --dependency com.google.code.gson:gson
   variant "compile" [
      org.gradle.status              = release (not requested)
      org.gradle.usage               = java-api
      org.gradle.libraryelements     = jar (compatible with: classes)
      org.gradle.category            = library

      Requested attributes not found in the selected variant:
         org.gradle.dependency.bundling = external
         org.gradle.jvm.version         = 8
   ]
   Selection reasons:
      - By conflict resolution : between versions 2.8.6 and 2.2.4

com.google.code.gson:gson:2.8.6
\--- com.google.protobuf:protobuf-java-util:3.19.4
     \--- compileClasspath

com.google.code.gson:gson:2.2.4 -> 2.8.6
\--- org.apache.hadoop:hadoop-common:2.10.1
     \--- io.confluent:kafka-connect-s3:5.5.7
          \--- compileClasspath

A web-based, searchable dependency report is available by adding the --scan option.

通过输出,我发现我的约束甚至没有被考虑,所以有什么提示我可能做错了吗?

感谢您的任何反馈。

更新: 我设法以不同的方式完成这项工作,但我认为这不是你应该做的。

构建.gradle:

implementation (group: 'com.google.protobuf', name: 'protobuf-java-util', version: protobufVersion) {
    exclude group: 'com.google.code.gson', module: 'gson'
}
implementation (group: 'io.confluent', name: 'kafka-connect-s3', version: confluentVersion) {
    exclude group: 'org.apache.hadoop', module: 'hadoop-common'
}

implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.9', transitive: true
implementation group: 'org.apache.hadoop', name: 'hadoop-common', version: '3.3.1',  transitive: true
constraints {
    implementation('com.google.code.gson:gson-2.8.9') {
        because 'ADA-1033 and ADA-1042 (VULN-4102, VULN-4090)'
    }
    implementation('org.apache.hadoop:hadoop-common-3.3.1')
}


$ ./gradlew -q dependencyInsight --dependency com.google.code.gson:gson
   variant "compile" [
      org.gradle.status              = release (not requested)
      org.gradle.usage               = java-api
      org.gradle.libraryelements     = jar (compatible with: classes)
      org.gradle.category            = library

      Requested attributes not found in the selected variant:
         org.gradle.dependency.bundling = external
         org.gradle.jvm.version         = 8
   ]
   Selection reasons:
      - By conflict resolution : between versions 2.8.9 and 2.2.4

com.google.code.gson:gson:2.8.9
\--- compileClasspath

com.google.code.gson:gson:2.2.4 -> 2.8.9
\--- org.apache.hadoop:hadoop-common:3.3.1
     \--- compileClasspath

A web-based, searchable dependency report is available by adding the --scan option.

就像我说的,这似乎有效,但我认为如果我只是通过声明传递依赖来强制它成为某个版本,我什至不需要那里的约束块。我仍然想了解为什么我的第一个示例不起作用。

gradle build.gradle dependency-management
1个回答
0
投票

这里需要注意的一件事是,这里的

constraints{}
不是
implementation
的属性,它是兄弟姐妹。我建议您合并为一个
constraints
部分,因为有两个部分不必要地复杂,并且在您的情况下会导致冗余:

dependencies {
    implementation (group: 'com.google.protobuf', name: 'protobuf-java-util', version: '3.19.4')
    implementation (group: 'io.confluent', name: 'kafka-connect-s3', version: '5.5.7')

    constraints {
        implementation('com.google.code.gson:gson-2.8.9')
        implementation('org.apache.hadoop:hadoop-common-3.3.1')
    }
}

其次,您的约束中的版本语法是错误的。当您需要冒号时,您可以使用连字符。所以正确的语法是:

    constraints {
        implementation('com.google.code.gson:gson:2.8.9')
        implementation('org.apache.hadoop:hadoop-common:3.3.1')
    }

您可以在 mvnrepository 上找到所需的确切语法片段 https://mvnrepository.com/artifact/com.google.code.gson/gson/2.8.9#gradle-short https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common/3.3.1#gradle-short

所以要使用的配置是

dependencies {
    implementation (group: 'com.google.protobuf', name: 'protobuf-java-util', version: '3.19.4')
    implementation (group: 'io.confluent', name: 'kafka-connect-s3', version: '5.5.7')

    constraints {
        implementation('com.google.code.gson:gson:2.8.9')
        implementation('org.apache.hadoop:hadoop-common:3.3.1')
    }
}
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.