¿Cómo puedo obligar a Gradle a volver a descargar las dependencias?

742

¿Cómo puedo decirle a Gradle que vuelva a descargar las dependencias de los repositorios?

fedor.belov
fuente

Respuestas:

845

Generalmente, puede actualizar las dependencias en su caché con la opción de línea de comando --refresh-dependencies . También puede eliminar los archivos en caché en ~/.gradle/caches. Con la próxima compilación, Gradle intentaría descargarlos nuevamente.

¿Cuál es su caso de uso específico? ¿Utiliza versiones de dependencia dinámica o versiones SNAPSHOT?


En los sistemas Unix, puede eliminar todos los artefactos existentes (artefactos y metadatos) que Gradle ha descargado usando:

rm -rf $HOME/.gradle/caches/
Benjamin Muschko
fuente
27
No puedo hablar por el OP, pero mi caso de uso específico es probar si mi configuración de un repositorio no MavenCentral realmente funciona.
Emil Lundberg
77
También debe eliminar el directorio ~ / .m2 (si existe). Si ha configurado el repositorio de Maven, algunos de esos artefactos también se descargarán a ~ / .m2. Es mejor eliminar tanto ~ / .gradle como ~ / .m2 para comenzar en pizarra limpia.
Gopinath MR
17
Maven Local solo es relevante si su compilación lo define como un repositorio.
Benjamin Muschko
21
@Gopinath es un consejo peligroso, ya que .m2 puede contener un archivo de configuración de Maven. Supongo que te refieres a eliminar .m2 / repositorio
Ward
99
find $HOME/.gradle/caches/ -name "*LIBRARY_NAME*" -exec rm -r {} \;
fangzhzh
709

Si está utilizando una versión reciente de Gradle, puede usar la opción --refresh-dependencies.

./gradlew build --refresh-dependencies

puedes consultar el manual de Gradle .

La opción --refresh-dependencies le dice a Gradle que ignore todas las entradas en caché para módulos resueltos y artefactos. Se realizará una nueva resolución en todos los repositorios configurados, con versiones dinámicas recalculadas, módulos actualizados y artefactos descargados.

Naga
fuente
10
Debe tener en cuenta que dado que Gradle intentará descargar todos los archivos de dependencia, lleva mucho tiempo.
Naga
11
También vale la pena señalar que esto no siempre funciona. Acabo de probar la ejecución de "gradle clear war --refresh-dependencies" con un jar en caché que tenía tres días de antigüedad, cuando había implementado una nueva versión la noche anterior. La compilación se rompió debido a una dependencia faltante que se agregó en el nuevo código. Todavía tenía el frasco de tres días en el caché después. Terminé simplemente borrando la carpeta de la versión en mi caché .m2 y reconstruyéndola. Luego obtuvo la versión más nueva porque básicamente no tenía otra opción.
Spanky Quigman
10
mejor aún ./gradlew --refresh-dependencies
headsvk
1
Esto funcionó muy bien como './gradlew build --refresh-dependencies' desde el terminal de Android Studio. ¡Gracias!
the_dude_abides
2
¿Hay alguna manera de hacer que Android Studio haga esto en una compilación desde el IDE?
karl
314

Puede decirle a Gradle que vuelva a descargar algunas dependencias en el script de compilación marcando la dependencia como 'cambiante'. A continuación, Gradle buscará actualizaciones cada 24 horas, pero esto se puede configurar mediante la resolución DSL de StrategyStrategy. Me resulta útil usar esto para las compilaciones SNAPSHOT o NIGHTLY.

configurations.all {
    // Check for updates every build
    resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
}

Expandido:

dependencies {
    implementation group: "group", name: "projectA", version: "1.1-SNAPSHOT", changing: true
}

Condensado:

implementation('group:projectA:1.1-SNAPSHOT') { changing = true }

Encontré esta solución en este hilo del foro .

Umi
fuente
44
¿Sabes cómo funciona esto para las fuentes de la misma biblioteca? Actualmente, la biblioteca compilada se descarga cada vez que cambia, pero la fuente no.
Markus Wüstenberg
2
Una versión de instantánea está "cambiando" por definición. Gradle lo sabe, por lo que no es necesario que defina esto en su declaración de dependencia.
Benjamin Muschko
44
Gracias por esto. FWIW, nuestra dependencia estaba en una versión instantánea y hasta que lo hicimos no estaba buscando actualizaciones en cada compilación.
sfitts
10
cacheChangingModulesFores la clave, changing: truees opcional porque está implícito -SNAPSHOT, es posible usar la abreviatura aquí: compile 'group:projectA:1.1-SNAPSHOT'debido a la implicación anterior. También se puede restringir el resolutionStrategy a uno config: configurations.compile.resolutionS....
TWiStErRob
2
@Umi ¿Hay una versión condensada de esto? Tales como compile 'com.burrowsapps:ads:1.0:true'?
Jared Burrows
63

Para Mac

./gradlew build --refresh-dependencies

Para ventanas

gradlew build --refresh-dependencies

También puede intentar gradlew assembleDevelopmentDebug --refresh-dependencies

Ali
fuente
2
Android usa gradle regular. Es solo un complemento.
Dragas
El envoltorio Gradle no es exclusivo de Android. Puede generar uno usando la gradle wrappertarea; incluso puede generar una envoltura usando otra envoltura de Gradle:gradlew wrapper
Salvioner
28

Para Windows ... para hacer que Gradle vuelva a descargar dependencias específicas :

  1. elimine las dependencias que desea volver a descargar del directorio siguiente:

    C:\Users\%USERNAME%\.gradle\caches\modules-2\files-2.1
    
  2. elimine todos los directorios de metadatos en la ruta:

    C:\Users\%USERNAME%\.gradle\caches\modules-2\metadata-*
    
  3. ejecutar gradle build(o gradlew buildsi está usando gradle wrapper) en el directorio raíz del proyecto.

nota: los números en las rutas de archivo anteriores pueden ser diferentes para usted.

Eric
fuente
19

Se puede eliminar la carpeta con tarros en caché.

En mi caso, en Mac, la biblioteca se almacenó en caché en la ruta:

/Users/MY_NAME/.gradle/caches/modules-2/files-2.1/cached-library-to-remove

Eliminé la carpeta de la biblioteca en caché ("cached-library-to-remove" en el ejemplo anterior), eliminé la carpeta de compilación de mi proyecto y la compilé nuevamente. La biblioteca nueva se descargó entonces.

Farhan
fuente
16

En lugar de eliminar todo el caché de gradle, como sugieren algunas respuestas aquí, puede eliminar el caché para un grupo específico o identificación de artefacto. Agregué la siguiente función a mi .bash_profile:

deleteGradleCache() {
  local id=$1
  if [ -z "$id" ]; then
    echo "Please provide an group or artifact id to delete"
    return 1
  fi
  find ~/.gradle/caches/ -type d -name "$id" -prune -exec rm -rf "{}" \; -print
}

Uso:

$ deleteGradleCache com.android.support

Luego, en la próxima compilación o si vuelve a sincronizar, Gradle volverá a descargar las dependencias.

Jared Rummler
fuente
9

Hay 2 formas de hacerlo:

  1. Uso de la opción de línea de comando para actualizar las dependencias de cobro.
  2. Puede borrar el caché local donde los artefasts son cachés de Gradle y activar la compilación

Usando la opción --refresh-dependencies :

./gradlew build --refresh-dependencies

Breve explicación : la opción -fresh-dependencies le dice a Gradle que ignore todas las entradas en caché para módulos resueltos y artefactos.

Explicacion larga

  • Con Graf –defresh-dependencies siempre llegará al servidor remoto para verificar si hay artefactos actualizados: sin embargo, Gradle evitará descargar un archivo donde el mismo archivo ya existe en la memoria caché.
    • First Gradle realizará una solicitud HEAD y comprobará si el servidor informa que el archivo no ha cambiado desde la última vez (si la 'longitud de contenido' y 'última modificación' no han cambiado). En este caso, recibirá el mensaje: "El recurso en caché está actualizado (lastModified: {})".
    • Siguiente Gradle determinará la suma de verificación remota si es posible (ya sea desde la solicitud HEAD o descargando un archivo '.sha1'). Si esta suma de verificación coincide con otro archivo ya descargado (desde cualquier repositorio), entonces Gradle simplemente copiará el archivo en caché, en lugar de volver a descargar. En este caso, recibirá el mensaje: "" Se encontraron recursos disponibles localmente con suma de comprobación coincidente: [{}, {}] ".

Usar eliminar: cuando eliminas cachés

rm -rf $HOME/.gradle/caches/

Simplemente limpie todos los frascos almacenados en caché y las sumas sha1 y Gradle se encuentra en una situación en la que no hay artefactos en su máquina y tiene que descargar todo. Sí, funcionará al 100% por primera vez, pero cuando se publique otro SNAPSHOT y sea parte de su árbol de dependencia, se enfrentará nuevamente frente a la opción de actualizar o purgar las cachés.

Xelian
fuente
9

Esto funcionó para mí. Asegúrese de que Gradle no esté configurado como fuera de línea desmarcando el botón Archivo> Configuración> Gradle> Trabajo sin conexión.

Agregue esto al nivel superior de su build.gradle, es bueno tener dependencias anteriores

configurations.all {
    resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
}

Me aseguré de que mis dependencias se escriban así:

implementation('com.github.juanmendez:ThatDependency:ThatBranch-SNAPSHOT') {
    changing = true
}

A partir de entonces, abro el panel de Gradle en Android Studio y hago clic en el botón de flechas de círculo azul. Siempre puedo ver mis actualizaciones obteniendo una nueva copia nueva.

Juan mendez
fuente
9

Ninguna de las soluciones anteriores funcionó para mí.

Si usa IntelliJ, lo que lo resolvió para mí fue simplemente actualizar todos los proyectos de Gradle:

ingrese la descripción de la imagen aquí

Kobbi Gal
fuente
7

Para aquellos que se preguntan dónde ejecutar los comandos de gradle:

  1. Abra Android Studio
  2. Haga clic en Terminal (Lo encontrará en la base de Android Studio)
  3. La herramienta de comando se abrirá
  4. Escribe tu comando gradlew build --refresh-dependencies
kgandroid
fuente
6

Para Android Studio 3.4.1

Simplemente abra la pestaña gradle (puede ubicarse a la derecha) y haga clic derecho en el padre en la lista (debería llamarse "Android"), luego seleccione "Actualizar dependencias".

Esto debería resolver su problema.

Carl Du Plessis
fuente
4

Mb Llego demasiado tarde, sin embargo, mi solución es para un único repositorio. Creo que eliminar ~ / .gradle / * es exagerado. El problema con el que me topé fue que estaba eliminando el directorio donde estaban las fuentes y Gradle obtenía otra versión que no era de nexus. Para evitar eso ejecuto el siguiente:

~/.gradle$ find . -type d -name 'group.plugins.awssdk'
./caches/modules-2/files-2.1/group.plugins.awssdk
./caches/modules-2/metadata-2.23/descriptors/group.plugins.awssdk

~/.gradle$ rm -r ./caches/modules-2/files-2.1/group.plugins.awssdk   ./caches/modules-2/metadata-2.23/descriptors/group.plugins.awssdk

Después de eso, Gradle está arrastrando archivos desde nexus.

Vadim
fuente
2

Para actualizar la versión 'lanzamiento' en caché, la única opción es borrar el caché local.

rm -rf $HOME/.gradle/caches/

Para actualizar la versión 'instantánea' en caché puede:

./gradlew build --refresh-dependencies
Karol Król
fuente
1

Al eliminar todas las cachés, se vuelven a descargar todas las dependencias. por lo tanto, lleva tanto tiempo y es aburrido esperar nuevamente para volver a descargar todas las dependencias.

¿Cómo podría ser capaz de resolver esto a continuación?

Simplemente elimine los grupos que deben actualizarse.

Ej: si queremos actualizar el grupo com.user.test

rm -fr ~/.gradle/caches/modules-2/files-2.1/com.user.test/

luego elimine la dependencia de build.gradle y vuelva a agregarla. entonces refrescará las dependencias de lo que queramos.

Chamly Idunil
fuente
0

eliminar este directorio:

C:\Users\[username]\.gradle
farhang67
fuente
3
Dado que existen configuraciones potencialmente locales, eliminar (o renombrar / reubicar) el directorio de cachés como se menciona en otras respuestas es una mejor solución.
dimwittedanimal
0

Para la mayoría de los casos, simplemente reconstruir el proyecto debería ser suficiente. A veces tiene que ejecutar ./gradlew build --refresh-dependenciesya que varias respuestas ya han mencionado (lleva mucho tiempo, dependiendo de la cantidad de dependencias que tenga). Sin embargo, a veces ninguno de esos funcionará: la dependencia simplemente no se actualizará. Entonces, puedes hacer esto:

  1. Eliminar la dependencia de su archivo gradle
  2. Ejecute / depure su proyecto y espere a que falle (con NonExistingClassrazón)
  3. Presiona "construir proyecto" y espera a que termine con éxito
  4. Ejecutar / depurar una vez más

Esto es ridículo y parece una locura, pero en realidad uso este procedimiento a diario, simplemente porque la dependencia que necesito se puede actualizar docenas de veces y ninguna de las soluciones adecuadas tendría ningún efecto.

egorikem
fuente
0

Puedes hacerlo así

https://marschall.github.io/2017/04/17/disabling-gradle-cache.html

Para citar de Desactivar la caché de compilación de Gradle

El caché de compilación de Gradle puede ser una gran cosa cuando regularmente construye> proyectos grandes con Gradle. Sin embargo, cuando solo ocasionalmente construye proyectos de código abierto, puede hacerse rápidamente grande.

Para deshabilitar la caché de compilación de Gradle, agregue la siguiente línea a ~/.gradle/gradle.properties

org.gradle.caching=false

Puede limpiar el caché existente con

rm -rf $HOME/.gradle/caches/
rm -rf $HOME/.gradle/wrapper/
wuqilong
fuente
0

Si está utilizando eclipse y desea forzar eclipse para volver a cargar las dependencias, puede probar el siguiente comando

gradlew clean cleaneclipse build eclipse --refresh-dependencies
ULLAS K
fuente
2
¿Por qué usarías Eclipse? ¡Especialmente en 2018!
Christopher Perry
0

Solo funciona una eliminación manual de la dependencia específica en la carpeta de caché ... un artefacto creado por un colega en el repositorio empresarial.

WesternGun
fuente
0

En mi caso, ninguno de los anteriores funcionó, lo que hice fue:

  • En build.gradle, comentando las dependencias relacionadas con las importaciones no resueltas que tuve
  • Al hacer clic en "Sincronizar ahora"
  • Descomentando lo que acabo de comentar
  • Al hacer clic en "Sincronizar ahora" nuevamente

Entonces mis importaciones se resolvieron correctamente nuevamente.

Louis
fuente
-7

Debe volver a descargarlo, para que pueda descargar y reemplazar manualmente el archivo dañado y volver a sincronizar su proyecto. Vaya a esta ubicación C: \ users [nombre de usuario] .gradle \ wrapper \ dist \ gradle3.3-all \ 55gk2rcmfc6p2dg9u9ohc3hw9 \ gradle-3.3-all.zip Aquí elimine gradle3.3allzip y reemplácelo descargando nuevamente desde este sitio https: / /services.gradle.org/distributions/ Encuentre el mismo archivo y descárguelo y péguelo en esa ubicación. Luego sincronice su proyecto. Espero que funcione para usted también.

Rahul Gupta
fuente