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'.

无法发布配置“存档”无法初始化 POM pom-default.xml:无法在 /home/workspace/counter/counter-module/build/poms/pom-default.xml 验证项目 lt.counter 的 POM

4

2 回答 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. 每当他们试图变得棘手时,强制他们使用预定的版本。
于 2013-06-20T13:45:32.033 回答
0

Gradle 的默认解析策略是使用最新版本,所以会使用版本 N;N-1 版不会。

您没有告诉我们您正在使用哪个版本的 Gradle 以及您项目的完整结构。你在做一个多项目构建吗?

另外我不明白您的自定义解决策略 - 为什么版本会为空?

- 编辑 -

最新版本是默认的解析策略,所以会使用遇到的最高版本。

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

于 2013-06-20T08:47:27.680 回答