Gradle выбирает неправильную версию зависимости

Я вижу некоторые странности в моей сборке Gradle. У меня есть приложение Spring Boot (которое использует Gradle для сборки), и я пытаюсь использовать как Hibernate Validator, так и Hibernate Core. Вот объявление dependencies в моем файле build.gradle:

dependencies {
    compile('org.springframework.boot:spring-boot-starter-web') {
        exclude module: 'spring-boot-starter-tomcat'
    }

    compile(
        'org.codehaus.groovy:groovy-all:2.4.12'
        ,'com.google.inject:guice:4.1.0'
        ,'ch.qos.logback:logback-classic:1.2.3'
        ,'org.slf4j:jul-to-slf4j:1.7.25'
        ,'org.apache.logging.log4j:log4j-to-slf4j:2.9.1'
        ,'commons-cli:commons-cli:1.4'
        ,'org.apache.commons:commons-lang3:3.7'
        ,'io.dropwizard.metrics:metrics-core:3.2.5'
        ,'io.dropwizard.metrics:metrics-json:3.2.5'
        ,'org.springframework.security:spring-security-jwt:1.0.9.RELEASE'
        ,'org.springframework.security.oauth:spring-security-oauth2:2.2.1.RELEASE'
        ,'io.jsonwebtoken:jjwt:0.9.0'
        ,'org.hibernate:hibernate-validator:6.0.7.Final'
        ,'mysql:mysql-connector-java:6.0.6'
        ,'org.hibernate:hibernate-core:5.2.12.Final'

        ,'com.h2database:h2:1.4.196'

        ,'org.springframework.boot:spring-boot-starter-jetty'
        ,'org.springframework.boot:spring-boot-starter-actuator'
        ,'org.springframework.boot:spring-boot-starter-security'
        ,'org.springframework.boot:spring-boot-starter-data-rest'
        ,'org.springframework.boot:spring-boot-starter-data-jpa'
    )

    dev('org.springframework.boot:spring-boot-devtools')

    testCompile(
        'org.spockframework:spock-core:1.0-groovy-2.4'
        ,'junit:junit:4.12'
    )
}

Когда я запускаю ./gradlew dependencies, я получаю огромный вывод, но из дерева зависимостей compile я вижу следующее:

|    +--- org.springframework.boot:spring-boot-starter:1.5.8.RELEASE
|    +--- org.hibernate:hibernate-validator:5.3.5.Final -> 6.0.7.Final
|    |    \--- org.hibernate.validator:hibernate-validator:6.0.7.Final
|    |         +--- javax.validation:validation-api:2.0.1.Final -> 1.1.0.Final
|    |         +--- org.jboss.logging:jboss-logging:3.3.0.Final -> 3.3.1.Final
|    |         \--- com.fasterxml:classmate:1.3.1 -> 1.3.4

Так что мне кажется, что spring-boot-starter:1.5.8.RELEASE тянет validation-api:2.0.1.Final, но по какой-то причине Gradle выбирает validation-api:1.1.0.Final для меня... я правильно понимаю? В моем пути к классам компиляции IDE я вижу только validation-api:1.1.0.Final, а не 2.0.1.Final.

Почему Gradle выбирает 1.1.0.Final вместо 2.0.1.Final? Я спрашиваю, потому что Hibernate Validator 5.x не совместим с Validation API 1.x, и когда мое приложение запускается, я получаю всевозможные ошибки, связанные с проверкой Hibernate.

Обновлять

Еще немного вывода:

gradle -q dependencyInsight --configuration compile --dependency validation-api
javax.validation:validation-api:1.1.0.Final (selected by rule)

javax.validation:validation-api:2.0.1.Final -> 1.1.0.Final
\--- org.hibernate.validator:hibernate-validator:6.0.7.Final
     \--- org.hibernate:hibernate-validator:6.0.7.Final
          +--- compile
          \--- org.springframework.boot:spring-boot-starter-web:1.5.8.RELEASE
               +--- compile
               \--- org.springframework.boot:spring-boot-starter-data-rest:1.5.8.RELEASE
                    \--- compile

Полный вывод конфигурации компиляции можно найти здесь.


person smeeb    schedule 02.01.2018    source источник
comment
Опубликуйте полное дерево конфигурации компиляции. Также рассмотрите возможность использования dependencyInsight (mrhaki.blogspot.fr/2014). /08/) и опубликовать вывод.   -  person JB Nizet    schedule 02.01.2018
comment
Спасибо @JBNizet (+1) - см. ссылку на мой pastebin, добавленную вверху этого вопроса. Я также добавил вывод dependencyInsigh для библиотеки validation-api, если это вам поможет! Спасибо еще раз!   -  person smeeb    schedule 02.01.2018


Ответы (3)


Версия обеспечивается Spring Boot.

См. POM для зависимостей Spring Boot: http://search.maven.org/remotecontent?filepath=org/springframework/boot/spring-boot-dependencies/1.5.8.RELEASE/spring-boot-зависимости-1.5.8.RELEASE.pom и найдите «javax-validation.version».

См. https://docs.spring.io/platform/docs/Brussels-SR4/reference/html/getting-started-overriding-versions.html для получения дополнительной информации о том, как переопределить версии Spring Boot.

Я бы рекомендовал напрямую переопределить «javax-validation.version» и «hibernate-validator.version» вместо переопределения зависимостей.

person Guillaume Smet    schedule 02.01.2018
comment
Спасибо @Guaillaume (+1). Я никогда раньше этого не делал (напрямую переопределяя javax.validation.version + hibernate-validator.version). Это то, что я делаю в build.gradle или в application.yml? - person smeeb; 02.01.2018
comment
Посмотрите ссылку, которую я вам дал, у вас есть абзац о том, как переопределить версии с помощью Gradle: docs.spring.io/platform/docs/Brussels-SR4/reference/html/ . - person Guillaume Smet; 02.01.2018
comment
Спасибо, я вижу это, так что это объявление ext['foo.version'] = '1.1.0.RELEASE', я помещаю его в мое объявление dependencies в Gradle или я помещаю его вне этого объявления (может быть, над ним и т. д.)? - person smeeb; 02.01.2018
comment
Я больше парень из Maven, но я бы сказал, что в корне build.gradle над объявлением зависимостей (ах, и используйте javax.validation.version, а не foo.version;)). - person Guillaume Smet; 02.01.2018
comment
Переопределение для gradle, как описано в документах, у меня не сработало. Это, однако, сделало: 6507 - person Dr4gon; 11.04.2018

Существует некоторый конфликт с другой зависимостью, которая тянет старую версию 1.1.0 в пути к классам компиляции.

Это означает, что какая-то другая библиотека, имеющая более высокий приоритет в порядке сборки gradle, зависит от более старой версии 1.1.0.

Вы можете увидеть здесь дополнительную информацию о том, как указать порядок сборки gradle .

person Tal Avissar    schedule 02.01.2018
comment
Спасибо @Tal (+1) - пожалуйста, посмотрите мою ссылку на pastebin, добавленную в начало этого вопроса. Я также добавил вывод dependencyInsigh для библиотеки validation-api, если это вам поможет! Спасибо еще раз! - person smeeb; 02.01.2018
comment
Кроме того, @Tal, согласно выводам всех этих деревьев зависимостей, org.hibernate.validator:hibernate-validator:6.0.7.Final - единственное, что тянет validation-api... - person smeeb; 02.01.2018
comment
Обратите внимание, что спящий режим версии 5.x.x. вытаскивает javax.validation:validation-api:1.1.0.Final, и я вижу, что у вас также есть org.hibernate:hibernate-core:5.2.12.Final - person Tal Avissar; 02.01.2018
comment
Спасибо, @Tal, но я вас не понимаю... звучит так, как будто вы говорите, что org.hibernate:hibernate-core:5.2.12.Final тянет вниз validation-api:1.1.0.Final, но я не вижу доказательств этого в моем дереве зависимостей. Можете ли вы уточнить немного больше? - person smeeb; 02.01.2018
comment
У вас есть --- org.hibernate:hibernate-validator:5.3.5.Final -> 6.0.7.Final | | \--- org.hibernate.validator:hibernate-validator:6.0.7.Final - person Tal Avissar; 02.01.2018

Я столкнулся с похожими проблемами, а затем обнаружил, что это вызвано использованием управления зависимостями в gradle:

plugins {
     ...
    id 'io.spring.dependency-management' version '1.0.10.RELEASE'
}

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:Hoxton.SR8"
    }
}

это управление зависимостями влияет на решение версии транзитивной зависимости. после того, как прокомментировать это. все версии правильные.

person xianlinbox    schedule 23.02.2021