【问题标题】:Gradle: Changing configuration of external dependencyGradle:更改外部依赖项的配置
【发布时间】:2017-06-08 14:12:46
【问题描述】:

我们处于将 commons-collections 从版本 3 更新到版本 4 的情况。由于他们已将组 ID 更改为 commons-collections4,我们最终将在类路径中拥有 2 个版本的 commons-collection。第 3 版和第 4 版。 对于我们的开发,应该使用版本 4。版本 3 将通过外部依赖项进入,所以如果我们喜欢:

compile ("org.hibernate:hibernate-entitymanager:3.5.6-Final")

将通过 hibernate-entitymanager 进入的版本 3 也将在编译时提供。所以开发人员可以使用它。

有没有办法说“commons-collections 3 现在应该被视为通过 hibernate-entitymanager 提供的运行时依赖项”?

我们使用的是 Gradle 3.5。

【问题讨论】:

    标签: java gradle


    【解决方案1】:

    不确定是否存在适当的方法来实现这一点,但是如果您在compile 配置中强制将所有版本的commons3 替换为commons4,并另外定义一个runtime only 注释呢?

    configurations.compile {
        resolutionStrategy.force 'commons4',
    }
    
    dependencies {
        runtime('commons3')
    }
    

    【讨论】:

    • 这可行。我猜 gradle 不会为这种情况提供更好的方法。我明天试试。谢谢!
    【解决方案2】:

    查看here,他们使用replacedBy 告诉gradle com.google.collections:google-collections 已被com.google.guava:guava 替换。 Gradle 现在会将这两个模块视为依赖解析中的一个模块,并且永远不会同时包含这两个模块。

    dependencies {
        modules {
            module("com.google.collections:google-collections") {
                replacedBy("com.google.guava:guava")
            }
        }   
    }
    

    【讨论】:

    • 这不是我想要存档的。我们需要在类路径中同时拥有两者。 commons-collections 也更改了它们的包结构,因此与版本 3 一起使用的外部依赖项仍然需要使用版本 3。例如。在版本 3 中,MapUtils 在包 import org.apache.commons.collections.MapUtils 中,在版本 4 中,它在 import org.apache.commons.collections4.MapUtils 中。因此,我不能只是替换它。
    【解决方案3】:

    感谢 webdizz 让我想到了这个想法,我似乎通过以下方式实现了它:

    configurations.compileClasspath.resolutionStrategy {
        dependencySubstitution {
            substitute module('commons-collections:commons-collections') with module("org.apache.commons:commons-collections4:${COMMONS_COLLECTIONS_VERSION}")
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-25
      • 1970-01-01
      • 2016-04-19
      • 1970-01-01
      相关资源
      最近更新 更多