如何在Gradle中遮盖传递依赖关系?

有没有办法在Gradle中隐藏特定的(可传递的)依赖项?我的情况:我有一个直接依赖于 和 的项目,但反过来又取决于最终 JAR 的螺丝钉,但我无论如何都需要两者。com.amazonaws:aws-java-sdk-emr:1.10.33org.apache.hadoop:hadoop-aws:2.7.1hadoop-awscom.amazonaws:aws-java-sdk-emr:1.7.4

目前有可能做这样的事情吗?

shadowJar {
    relocate('com.amazonaws', 'shadowedstuff.awsjdk') {
        include(dependency('com.amazonaws:aws-java-sdk:1.7.4'))
    }
}

还是一个不那么肮脏的解决方法?

谢谢!

注意:我的项目直接依赖于哪些内容不是一个选项。这是一种简化,在原始设置中,一些反射正在进行中。aws-sdk


答案 1

是的,您可以使用 Gradle 的影子插件,该插件的语法与您的示例非常相似

// Configuring Filtering for Relocation
shadowJar {
   relocate('junit.textui', 'a') {
       exclude 'junit.textui.TestRunner'
   }
   relocate('junit.framework', 'b') {
       include 'junit.framework.Test*'
   }
}

答案 2

如果我误解了您的情况,并且实际上它更复杂,但看起来排除可以在依赖关系声明中提供,请道歉?

dependencies {
    ...
    compile('org.apache.hadoop:hadoop-aws:2.7.1') {
        exclude group: 'com.amazonaws', module: 'aws-java-sdk'
    }
    ...
}

推荐