2013-06-19 3 views
6

Я переношу проект Maven в Gradle. Мне нужно управлять зависимостями так судимым resolutionStrategy так:Gradle dependencyManagement

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

Could not publish configuration 'archives' Unable to initialize POM pom-default.xml: Failed to validate POM for project lt.counter at /home/workspace/counter/counter-module/build/poms/pom-default.xml

+0

Я считаю, что вы ищете это: http://stackoverflow.com/questions/9547170/in-gradle-how-do-i-declare-common-dependencies-in-a-single-place It был третьим пунктом при поиске stackoverflow для точного текста заголовка вопроса ... –

+0

Но этот способ не заставляет использовать точную версию, которую вы хотите, если я использую версию зависимости N, а другая моя зависимость использует версию зависимости N- 1 Я получу конфликт. Мне нужно заставить все мои зависимости использовать версию N. – IowA

+0

А, я вижу. Да, техника карт действительно больше для удобства и СУХОЙ. Если вы не можете доверять своим разработчикам (и кто может?: P), вы будете нуждаться в разрешении, как вы пытаетесь. К сожалению, у меня нет непосредственного опыта. –

ответ

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. Дайте пользователям красивую обозначение карты, чтобы использовать, когда они хотят играть красиво, и добавьте отпечаток с вашей предопределенной версией.
  2. Заставьте их использовать предопределенную версию в любое время, когда они пытаются запутаться.
+0

Проблема в том, что Maven плагин генерирует default-pom.xml и не видит версии. И тогда это терпит неудачу при попытке проверить pom, у которого нет каких-либо зависимостей версий. – IowA

+0

Я не вижу очевидной связи между моим ответом и вашим комментарием. (Может быть, слишком рано для меня?: P) Вы говорите, что сообщение об ошибке из вашего вопроса оказывается проблемой с генерацией артефакта (часть pom), а не с разрешением зависимостей? –

0

Разрешения по умолчанию стратегия для Gradle - использовать новейшую версию, поэтому будет использоваться версия N; версия N-1 не будет.

Вы не сообщите нам, какую версию Gradle вы используете, и полную структуру ваших проектов. Вы делаете многопроектную сборку?

Кроме того, я не понимаю вашу стратегию пользовательского разрешения - почему версия всегда будет нулевой?

- редактировать -

Новейшая версия стратегии разрешение по умолчанию, так что высокая версия встречается будет использоваться.

Возможно, посмотрите на Gradle's examples on custom resolution strategies, например, на форсирование определенной версии.

+0

Да, это сборка нескольких модулей. Я использую Gradle 1.6. И это нужно не только для N и N-1, но что произойдет, если некоторые зависимости зависят от N + 1? чем Gradle собирается использовать версию N + 1 для всех зависимостей? – IowA

+0

Так как он (она?) Получает версию из карты конечных зависимостей, я предполагаю, что версия будет равна null при разрешении зависимости, для которой у него нет конкретной версии, установленной для. –

Смежные вопросы