Gradle正在选择错误的依赖版本

时间:2018-01-02 17:36:41

标签: spring-boot gradle hibernate-validator maven-central

我在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 is not compatible with 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

完整的编译配置输出can be found here

3 个答案:

答案 0 :(得分:1)

与另一个在编译类路径中拉动旧版1.1.0的依赖项存在一些冲突。

这意味着在gradle构建顺序中具有更高优先级的其他库依赖于旧的1.1.0版本。

您可以在此处查看有关如何指定gradle构建顺序的more info

答案 1 :(得分:1)

该版本由Spring Boot强制执行。

请参阅POM了解Spring Boot依赖项:http://search.maven.org/remotecontent?filepath=org/springframework/boot/spring-boot-dependencies/1.5.8.RELEASE/spring-boot-dependencies-1.5.8.RELEASE.pom并查找" javax-validation.version"。

有关如何覆盖Spring Boot版本的更多信息,请参阅https://docs.spring.io/platform/docs/Brussels-SR4/reference/html/getting-started-overriding-versions.html

我建议直接覆盖" javax-validation.version"和" hibernate-validator.version"而不是重新定义依赖关系。

答案 2 :(得分:0)

我也遇到过类似的问题,后来发现是在gradle中使用了依赖管理导致的:

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

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

这种依赖管理会影响传递依赖版本解决方案。注释掉之后。所有版本都是正确的。