java - que - traduccion gradle
¿Cómo puedo forzar a Gradle a configurar la misma versión para dos dependencias? (8)
Agregue esta sección al archivo dependencies.gradle
configurations.all {
resolutionStrategy {
force ''com.google.guava:guava:14.0.1''
force ''com.google.guava:guava-gwt:14.0.1''
}
}
Yo uso las siguientes dos dependencias:
compile ''com.google.guava:guava:14.0.1''
compile ''com.google.guava:guava-gwt:14.0.1''
Ambos deben ser la misma versión para funcionar correctamente. Como mis otras dependencias usan una versión superior, Gradle usa diferentes versiones para cada dependencia.
Encontré esto ejecutando
gradle dependencies
:
compile - Compile classpath for source set ''main''.
+--- com.google.guava:guava:14.0.1 -> 17.0
+--- com.google.guava:guava-gwt:14.0.1
| +--- com.google.code.findbugs:jsr305:1.3.9
| /--- com.google.guava:guava:14.0.1 -> 17.0
¿Cómo puedo forzar a Gradle a establecer la misma versión para estas dos dependencias?
Alternativamente, puede usar dependencySets (o mavenBom cuando BOM POM está disponible) compatible con el complemento Gradle spring-dependency-management . Tenga en cuenta que este complemento también se aplica automáticamente con el complemento Spring-boot Gradle. Para más detalles ver here .
plugins {
id ''io.spring.dependency-management'' version ''1.0.1.RELEASE''
}
dependencyManagement {
dependencies {
dependencySet(group: ''com.google.guava'', version: ''14.0.1'') {
entry ''guava''
entry ''guava-gwt''
}
}
}
dependencies {
compile ''com.google.guava:guava''
compile ''com.google.guava:guava-gwt''
}
Otra opción es usar la restricción de dependencia: https://docs.gradle.org/current/userguide/managing_transitive_dependencies.html#sec:dependency_constraints
dependencies {
implementation ''org.apache.httpcomponents:httpclient''
constraints {
implementation(''org.apache.httpcomponents:httpclient:4.5.3'') {
because ''previous versions have a bug impacting this application''
}
implementation(''commons-codec:commons-codec:1.11'') {
because ''version 1.9 pulled from httpclient has bugs affecting this application''
}
}
}
Si está bien usar la versión más nueva para ambas dependencias, la forma más sencilla de solucionar su problema es actualizar sus dependencias:
compile ''com.google.guava:guava:17.0''
compile ''com.google.guava:guava-gwt:17.0''
Eso asegurará que ambos estén en 17.0. Es más simple que tratar de forzarlos a ambos en la versión anterior y, como beneficio adicional, obtienes una versión más nueva, que (probablemente) viene con correcciones de errores y nuevas características.
Para ser justos, @Klunk menciona esto en su respuesta, al preguntar "¿No puedes usar la versión 17.0 como tu dependencia?", Sino que es pasajero y fácil de perder, así que pensé que tenía sentido publicar como una respuesta separada .
Sugeriría no establecer
transitive = false
, ya que a partir de este momento tendría que resolver el árbol de dependencia usted mismo manualmente.
Puede forzar la versión de guayaba deseada a través de
configurations.all
, o agregar la dependencia explícitamente y configurarla
forced = true
.
Ejemplos aquí: http://www.devsbedevin.net/android-understanding-gradle-dependencies-and-resolving-conflicts/
Tuve una situación similar en la que una de las dependencias usaba spring-web 4.2.4 que estaba rota. Debe forzar la versión de biblioteca específica que desee. Como se mencionó en otro comentario, puede causar problemas de compatibilidad, pero a veces es necesario.
La forma menos intrusiva de forzar una versión de biblioteca que encontré fue en lugar de usar
compile "org.springframework:spring-web:4.2.3.RELEASE"
especificando la configuración de dependencia como forzada:
compile("org.springframework:spring-web:4.2.3.RELEASE"){
force = true
}
Lo usé cuando necesitaba degradar la versión de Spring temporalmente (hasta el próximo lanzamiento).
Una de sus dependencias es forzar la actualización de la versión de guayaba.
Use
gradle dependencies
para localizar qué biblioteca está desalojando su versión.
El problema que tiene es que si lo fuerza a usar 14.0.1, otra biblioteca podría no funcionar correctamente. ¿No puede simplemente usar la versión 17.0 como su dependencia?
En lugar de mantener números de versión individuales en build.gradle, uso un archivo dependencies.gradle que tendrá un mapeo de números de versión y lo introduciré en build.gradle. De esa manera solo necesito mantener la versión de guayaba única. Entonces su ejemplo será:
dependencias.gradle
ext {
ver = [
guava: ''14.0.1''
]
}
y luego en el archivo build.gradle puede tener:
apply from: "dependencies.gradle"
dependencies {
compile group: ''com.google.guava'', module: ''guava'', version: ver.guava
compile group: ''com.google.guava'', module: ''guava-gwt'', version: ver.guava
}
entonces cuando quiero pasar a 17.0 solo necesito cambiar el dependencies.gradle.
También soy un fanático definido de establecer dependencias transitivas en falso con
configurations.compile { transitive = false }
de esta manera no tiene algunas dependencias desalojadas en tiempo de compilación, aunque puede tener un problema en tiempo de ejecución si la biblioteca de desalojo no es totalmente compatible con versiones anteriores. Seamos sinceros, si está escribiendo el código, debe saber qué bibliotecas usa y debe ser explícito acerca de sus dependencias. Lo protege de una de sus dependencias, actualizándolo y arruinándolo.
configurations.all {
resolutionStrategy {
eachDependency { DependencyResolveDetails details ->
if (details.requested.group == ''com.google.guava'') {
details.useVersion "14.0.1"
}
}
}
}
dependencies {
compile ''com.google.guava:guava''
compile ''com.google.guava:guava-gwt''
}