Gradle 选择了错误的依赖版本
Gradle is selecting wrong dependency version
我发现我的 Gradle 构建有些奇怪。我有一个 Spring 引导应用程序(它使用 Gradle 构建),我正在尝试同时引入 Hibernate Validator 和 Hibernate Core。这是我的 build.gradle
文件中的 dependencies
声明:
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。
与在编译类路径中提取旧版 1.1.0 的另一个依赖项存在一些冲突。
这意味着在 gradle 构建顺序中具有更高优先级的其他一些库依赖于旧的 1.1.0 版本。
您可以在此处 more info 查看如何指定 gradle 构建顺序。
该版本由 Spring Boot.
强制执行
查看 Spring 引导依赖项的 POM: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 引导版本的详细信息,请参阅 https://docs.spring.io/platform/docs/Brussels-SR4/reference/html/getting-started-overriding-versions.html。
我建议直接覆盖 "javax-validation.version" 和 "hibernate-validator.version" 而不是重新定义依赖项。
我遇到了类似的问题,后来发现是使用gradle中的依赖管理引起的:
plugins {
...
id 'io.spring.dependency-management' version '1.0.10.RELEASE'
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:Hoxton.SR8"
}
}
此依赖管理影响传递依赖版本解决方案。注释掉之后。所有版本都是正确的。
我发现我的 Gradle 构建有些奇怪。我有一个 Spring 引导应用程序(它使用 Gradle 构建),我正在尝试同时引入 Hibernate Validator 和 Hibernate Core。这是我的 build.gradle
文件中的 dependencies
声明:
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。
与在编译类路径中提取旧版 1.1.0 的另一个依赖项存在一些冲突。
这意味着在 gradle 构建顺序中具有更高优先级的其他一些库依赖于旧的 1.1.0 版本。
您可以在此处 more info 查看如何指定 gradle 构建顺序。
该版本由 Spring Boot.
强制执行查看 Spring 引导依赖项的 POM: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 引导版本的详细信息,请参阅 https://docs.spring.io/platform/docs/Brussels-SR4/reference/html/getting-started-overriding-versions.html。
我建议直接覆盖 "javax-validation.version" 和 "hibernate-validator.version" 而不是重新定义依赖项。
我遇到了类似的问题,后来发现是使用gradle中的依赖管理引起的:
plugins {
...
id 'io.spring.dependency-management' version '1.0.10.RELEASE'
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:Hoxton.SR8"
}
}
此依赖管理影响传递依赖版本解决方案。注释掉之后。所有版本都是正确的。