Gradle 依赖管理

7

我正在将Maven项目迁移到Gradle。我需要管理依赖项,因此尝试使用resolutionStrategy:

    def dependencyVersions = [
                'org.slf4j:slf4j-api' : '1.7.2', 
                'javax.inject:javax.inject' : '1',
                'com.google.code.findbugs:annotations' : '2.0.1',
                'com.typesafe:config' : '1.0.0',
                'ch.qos.logback:logback-classic' : '1.0.9', 
                'com.google.guava:guava' : '14.0',
                'com.google.inject:guice' : '3.0',
                'com.google.inject.extensions:guice-multibindings' : '3.0',
                'com.google.code.gson:gson' : '2.2.2',
                'joda-time:joda-time' : '2.1',
                'com.thoughtworks.paranamer:paranamer' : '2.5.2',
                'org.codehaus.groovy:groovy-all' : '2.0.6',
                'commons-validator:commons-validator': '1.4.0',
                'org.apache.shiro:shiro-core' : '1.2.1',
                'junit:junit-dep' : '4.10',
                'org.mockito:mockito-core' : '1.9.5',
                'org.hamcrest:hamcrest-core': '1.3',
                'org.hamcrest:hamcrest-library': '1.3',
                'org.unitils:unitils-core': '3.3'
             ]

configurations.all {
    resolutionStrategy {
        eachDependency { DependencyResolveDetails details ->  
        def version = dependencyVersions["$details.requested.group:$details.requested.name"]
        if (version != null)
            details.useVersion version
        }
    }
}

但是现在当我尝试通过Gradle安装(到本地Maven仓库)时,出现以下错误:

Execution failed for task ':counter-module:install'.

无法发布配置文件“archives” 无法初始化POM pom-default.xml: 在/home/workspace/counter/counter-module/build/poms/pom-default.xml中验证lt.counter项目的POM失败。

我相信你正在寻找这个链接:https://dev59.com/F2kw5IYBdhLWcg3w8fBJ 当你在Stackoverflow上搜索你的问题标题时,它是第三个出现的结果... - Josh Gagnon
但是这种方式并不强制使用您想要的确切版本,如果我正在使用依赖版本N,并且我的其他依赖项使用该依赖项版本N-1,那么就会发生冲突。我需要强制所有依赖项使用N版本。 - IowA
啊,我明白了。是的,使用映射技术确实更方便和符合DRY原则。如果你不能信任你的开发人员(谁能呢?:P),你会想要依赖解析,就像你现在正在尝试的那样。不幸的是,我没有第一手的经验。 - Josh Gagnon
2个回答

4
我可能仍然没有完全理解你的问题,但我在文档中注意到了一些内容。
// force certain versions of dependencies (including transitive)
//  *append new forced modules:
force 'asm:asm-all:3.3.1', 'commons-io:commons-io:1.4'
//  *replace existing forced modules with new ones:
forcedModules = ['asm:asm-all:3.3.1']

似乎您可以做以下事情:
def dependencyVersions = [
            'org.slf4j:slf4j-api' : '1.7.2', 
            'javax.inject:javax.inject' : '1',
            'com.google.code.findbugs:annotations' : '2.0.1',
            'com.typesafe:config' : '1.0.0',
            'ch.qos.logback:logback-classic' : '1.0.9', 
            'com.google.guava:guava' : '14.0',
            'com.google.inject:guice' : '3.0',
            'com.google.inject.extensions:guice-multibindings' : '3.0',
            'com.google.code.gson:gson' : '2.2.2',
            'joda-time:joda-time' : '2.1',
            'com.thoughtworks.paranamer:paranamer' : '2.5.2',
            'org.codehaus.groovy:groovy-all' : '2.0.6',
            'commons-validator:commons-validator': '1.4.0',
            'org.apache.shiro:shiro-core' : '1.2.1',
            'junit:junit-dep' : '4.10',
            'org.mockito:mockito-core' : '1.9.5',
            'org.hamcrest:hamcrest-core': '1.3',
            'org.hamcrest:hamcrest-library': '1.3',
            'org.unitils:unitils-core': '3.3'
         ]

force dependencyVersion.collect {k, v -> "$k:$v"}

在我看来,这样做可以实现两个原则:
  1. 为用户提供一个漂亮的地图符号,以便他们在想要添加预定版本的dep时使用。
  2. 强制他们在尝试深入了解时始终使用预定版本。

问题在于Maven插件正在生成default-pom.xml,但它看不到版本。然后,在尝试验证没有任何依赖项版本的pom时失败。 - IowA
我没有看到我的回答和你的评论之间的明显联系。(也许对我来说还太早了?:P)你是在说你的问题中的错误信息实际上是与构件生成(pom 部分)有关,而不是依赖项解析吗? - Josh Gagnon

0

Gradle的默认解析策略是使用最新版本,因此将使用版本N;版本N-1将不会被使用。

您没有告诉我们您正在使用哪个版本的Gradle以及您项目的完整结构。您是否正在进行多项目构建?

此外,我不理解您的自定义解析策略 - 为什么版本会为空?

-- 编辑 --

最新版本是默认的解析策略,因此将使用遇到的最高版本。

也许可以查看Gradle关于自定义解析策略的示例,例如强制使用特定版本。


是的,这是多模块构建。我正在使用Gradle 1.6。这不仅适用于N和N-1,如果某些依赖项依赖于N+1会发生什么呢?那么Gradle将为所有依赖项使用N+1版本? - IowA
由于他正在从有限依赖映射中获取版本,我假设当解析他没有为其设置特定版本的依赖项时,版本将为空。 - Josh Gagnon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接