Como forçar o gradle a baixar novamente dependências?

742

Como posso dizer à gradle para baixar novamente dependências de repositórios?

fedor.belov
fonte

Respostas:

845

Geralmente, você pode atualizar dependências no cache com a opção de linha de comando --refresh-dependencies . Você também pode excluir os arquivos em cache em ~/.gradle/caches. Com a próxima compilação, o Gradle tentaria baixá-los novamente.

Qual é o seu caso de uso específico? Você usa versões de dependência dinâmica ou versões do INSTANTÂNEO?


Nos sistemas Unix, é possível excluir todos os artefatos existentes (artefatos e metadados) que o Gradle baixou usando:

rm -rf $HOME/.gradle/caches/
Benjamin Muschko
fonte
27
Não posso falar pelo OP, mas meu caso de uso específico é testar se minha configuração de um repositório não-MavenCentral realmente funciona.
Emil Lundberg
7
Você também precisa remover o diretório ~ / .m2 (se existir). Se você configurou o repositório maven, alguns desses artefatos também serão baixados para ~ / .m2. Melhor remover ~ / .gradle e ~ / .m2 para iniciar na ardósia limpa.
Gopinath MR
17
O Maven Local é relevante apenas se sua compilação o definir como um repositório.
Benjamin Muschko
21
@Gopinath, que é um conselho perigoso, pois .m2 pode conter um arquivo de configuração do maven. Eu acho que você quer dizer excluir .m2 / repository
Ward
9
find $HOME/.gradle/caches/ -name "*LIBRARY_NAME*" -exec rm -r {} \;
Fangzhzh
708

Se você estiver usando uma versão recente do Gradle, poderá usar a opção --refresh-dependencies.

./gradlew build --refresh-dependencies

você pode consultar o manual Gradle .

A opção --refresh-dependencies diz ao Gradle para ignorar todas as entradas em cache dos módulos e artefatos resolvidos. Uma nova resolução será executada em todos os repositórios configurados, com as versões dinâmicas recalculadas, os módulos atualizados e os artefatos baixados.

Naga
fonte
10
Você deve observar que, como o gradle tentará baixar todos os arquivos de dependência, isso leva muito tempo.
Naga
11
Também é importante notar que isso nem sempre funciona. Acabei de testar a execução de "gradle clear war --refresh-dependencies" com um jar em cache com três dias de idade, quando implantei uma nova versão na noite passada. A compilação foi interrompida devido a uma dependência ausente que foi adicionada no novo código. Eu ainda tinha o frasco de três dias no cache depois. Acabei excluindo a pasta da versão no meu cache .m2 e reconstruindo. Em seguida, obteve a versão mais recente porque basicamente não tinha escolha!
Spanky Quigman 22/03
10
melhor ainda apenas ./gradlew --refresh-dependencies
headsvk 2/17/17 /
1
Isso funcionou muito bem como './gradlew build --refresh-dependencies' no terminal do Android Studio. Obrigado!
the_dude_abides
2
Existe uma maneira de obter o Android Studio para fazer isso em uma compilação a partir do IDE?
karl
314

Você pode solicitar que Gradle faça o download novamente de algumas dependências no script de construção sinalizando a dependência como 'alterando'. Gradle procurará atualizações a cada 24 horas, mas isso pode ser configurado usando o DSL resolutionStrategy. Acho útil usá-lo para compilações SNAPSHOT ou 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 }

Encontrei esta solução neste tópico do fórum .

Umi
fonte
4
Você sabe como isso funciona para fontes da mesma biblioteca? Atualmente, a biblioteca compilada é baixada toda vez que muda, mas a fonte não é.
Markus Wüstenberg
2
Uma versão de instantâneo está "mudando" por definição. Gradle sabe disso, então você não precisa definir isso na sua declaração de dependência.
Benjamin Muschko
4
Obrigado por isso. FWIW, nossa dependência era de uma versão instantânea e, até que fizemos isso, não estava verificando atualizações em todas as versões.
Sfts
10
cacheChangingModulesForé a chave, changing: trueé opcional porque está implícita -SNAPSHOT, é possível usar a abreviação aqui: compile 'group:projectA:1.1-SNAPSHOT'por causa da implicação acima. Um pode também restringir a resolutionStrategy a uma config: configurations.compile.resolutionS....
TWiStErRob
2
@Umi Existe uma versão condensada disso? Tais como compile 'com.burrowsapps:ads:1.0:true'?
Jared Burrows
63

Para MAC

./gradlew build --refresh-dependencies

Para Windows

gradlew build --refresh-dependencies

Também pode tentar gradlew assembleDevelopmentDebug --refresh-dependencies

Todos
fonte
2
Android usa gradle regular. É apenas um plugin.
Dragas
O wrapper Gradle não é exclusivo do Android. Você pode gerar uma gradle wrappertarefa usando ; você pode até gerar um invólucro usando outro invólucro Gradle:gradlew wrapper
Salvioner 29/11/19
28

Para Windows ... para fazer o gradle baixar novamente dependências específicas :

  1. exclua as dependências que deseja baixar novamente do diretório abaixo:

    C:\Users\%USERNAME%\.gradle\caches\modules-2\files-2.1
    
  2. exclua todos os diretórios de metadados no caminho:

    C:\Users\%USERNAME%\.gradle\caches\modules-2\metadata-*
    
  3. execute gradle build(ou gradlew buildse estiver usando o gradle wrapper) no diretório raiz do projeto.

nota: os números nos caminhos dos arquivos acima podem ser diferentes para você.

Eric
fonte
19

Pode-se remover a pasta com os frascos em cache.

No meu caso, no Mac, a biblioteca foi armazenada em cache no caminho:

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

Eu removi a pasta da biblioteca em cache ("biblioteca em cache para remover" no exemplo acima), excluí a pasta de compilação do meu projeto e compilei novamente. Nova biblioteca foi baixada então.

Farhan
fonte
16

Em vez de remover todo o cache de gradle, como sugerem algumas respostas aqui, você pode excluir o cache de um grupo ou ID de artefato específico. Eu adicionei a seguinte função ao meu .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

Em seguida, na próxima compilação ou se você ressincronizar, o gradle baixará novamente as dependências.

Jared Rummler
fonte
9

Existem 2 maneiras de fazer isso:

  1. Usando a opção de linha de comando para atualizar o caixa de dependências.
  2. Você pode excluir o cache local onde os artefasts são caches pelo Gradle e acionar a compilação

Usando a opção --refresh-dependencies :

./gradlew build --refresh-dependencies

Explicação resumida - a opção de atualização de dependências diz ao Gradle para ignorar todas as entradas em cache dos módulos e artefatos resolvidos.

Explicação longa

  • Com o Gradle de dependência de atualização, sempre o servidor remoto é acionado para verificar se há artefatos atualizados: no entanto, o Gradle evitará o download de um arquivo em que o mesmo arquivo já exista no cache.
    • O First Gradle fará uma solicitação HEAD e verificará se o servidor relata o arquivo como inalterado desde a última vez (se o 'comprimento do conteúdo' e 'a última modificação' permanecerem inalterados). Nesse caso, você receberá a mensagem: "O recurso em cache está atualizado (lastModified: {})."
    • O próximo Gradle determinará a soma de verificação remota, se possível (a partir da solicitação HEAD ou baixando um arquivo '.sha1'). Se essa soma de verificação corresponder a outro arquivo já baixado (de qualquer repositório), a Gradle simplesmente copiará o arquivo no diretório cache, em vez de fazer o download novamente. Nesse caso, você receberá a mensagem: "“ Recurso localmente disponível encontrado com soma de verificação correspondente: [{}, {}] ”.

Usando delete: ao excluir caches

rm -rf $HOME/.gradle/caches/

Você acabou de limpar todos os jarros em cache e as somas sha1 e o Gradle está em uma situação em que não há artefatos em sua máquina e precisa fazer o download de tudo. Sim, ele funcionará 100% pela primeira vez, mas quando outro SNAPSHOT for lançado e fizer parte da sua árvore de dependência, você será novamente confrontado com a opção de atualizar ou limpar os caches.

Xelian
fonte
9

Isso funcionou para mim. Verifique se o Gradle não está definido como offline desmarcando o botão em Arquivo> Configurações> Gradle> Trabalho offline.

Adicione isso ao nível superior do seu build.gradle, é bom ter dependências acima

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

Assegurei que minhas dependências fossem escritas assim:

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

Depois disso, abro o painel Gradle no Android Studio e clico no botão de setas do círculo azul. Sempre consigo ver minhas atualizações recebendo uma nova cópia nova.

Juan Mendez
fonte
9

Nenhuma das soluções acima funcionou para mim.

Se você usa o IntelliJ, o que o resolveu foi simplesmente atualizar todos os projetos Gradle:

insira a descrição da imagem aqui

Kobbi Gal
fonte
7

Para aqueles que estão se perguntando onde executar os comandos gradle:

  1. Abra o Android Studio
  2. Clique no Terminal (você o encontrará na base do Android Studio)
  3. A ferramenta de comando será aberta
  4. Digite seu comando gradlew build --refresh-dependencies
kgandroid
fonte
6

Para Android Studio 3.4.1

Simplesmente abra a guia gradle (pode estar localizada à direita) e clique com o botão direito do mouse no pai na lista (deve ser chamado de "Android") e selecione "Atualizar dependências".

Isso deve resolver seu problema.

Carl Du Plessis
fonte
4

Mb Estou atrasado, no entanto, minha solução é para repositório único. Eu acho que excluir ~ / .gradle / * é um exagero. O problema com o qual me deparei foi que eu estava excluindo o diretório onde estavam as fontes e o gradle estava recebendo outra versão, não do nexus. Para evitar que eu corra o próximo:

~/.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

Depois disso, o gradle está arrastando arquivos do nexus.

Vadim
fonte
2

Para atualizar a versão em cache 'release', a única opção é limpar o cache local.

rm -rf $HOME/.gradle/caches/

Para atualizar a versão em cache do 'instantâneo', você pode:

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

A exclusão de todos os caches faz o download de todas as dependências novamente. por isso demora tanto tempo e é chato esperar novamente para baixar novamente todas as dependências.

Como sempre eu poderia ser capaz de resolver isso abaixo caminho.

Apenas exclua os grupos que precisam ser atualizados.

Ex: se queremos atualizar o grupo com.user.test

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

remova a dependência do build.gradle e adicione-a novamente. então ele atualizará as dependências do que queremos.

Chamly Idunil
fonte
0

exclua este diretório:

C:\Users\[username]\.gradle
farhang67
fonte
3
Dado que existem configurações potencialmente locais, excluir ou renomear / realocar o diretório de caches, conforme mencionado em outras respostas, é uma solução melhor.
Dimwittedanimal #
0

Para a maioria dos casos, simplesmente reconstruir o projeto deve funcionar. Às vezes, você precisa executar ./gradlew build --refresh-dependenciescomo várias respostas já mencionadas (leva muito tempo, dependendo de quantas dependências você possui). No entanto, às vezes, nada disso funcionará: a dependência não será atualizada. Então, você pode fazer isso:

  1. Remova a dependência do seu arquivo gradle
  2. Execute / depure seu projeto e aguarde a falha (com NonExistingClassrazão)
  3. Clique em "construir projeto" e aguarde o término com êxito
  4. Executar / depurar mais uma vez

Isso é ridículo e parece loucura, mas na verdade eu uso esse procedimento diariamente, simplesmente porque a dependência de que preciso pode ser atualizada dezenas de vezes e nenhuma solução adequada teria efeito.

egorikem
fonte
0

Você pode fazer assim

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

Para citar Desabilitando o Gradle Build Cache

O cache de construção do Gradle pode ser ótimo quando você está construindo projetos grandes regularmente com o Gradle. No entanto, quando apenas ocasionalmente constrói projetos de código aberto, ele pode rapidamente se tornar grande.

Para desativar o cache de compilação Gradle, adicione a seguinte linha em ~/.gradle/gradle.properties

org.gradle.caching=false

Você pode limpar o cache existente com

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

Se você estiver usando o eclipse e se desejar forçar o eclipse a recarregar dependências, tente o comando abaixo

gradlew clean cleaneclipse build eclipse --refresh-dependencies
ULLAS K
fonte
2
Por que você usaria o Eclipse? Especialmente em 2018!
Christopher Perry
0

Somente uma exclusão manual da dependência específica na pasta cache funciona ... um artefato criado por um colega no repositório corporativo.

WesternGun
fonte
0

No meu caso, nenhuma das opções acima funcionou, o que fiz foi:

  • Em build.gradle, comentando as dependências relacionadas às importações não resolvidas que eu tinha
  • Clicando em "Sincronizar agora"
  • Sem comentar o que acabei de comentar
  • Clicando em "Sincronizar agora" novamente

Então minhas importações foram resolvidas corretamente novamente.

Louis
fonte
-7

Você precisa fazer o download novamente para poder baixar e substituir manualmente o arquivo corrompido e sincronizar novamente o seu projeto. Vá para este local C: \ users [nome de usuário] .gradle \ wrapper \ dist \ gradle3.3-all \ 55gk2rcmfc6p2dg9u9ohc3hw9 \ gradle-3.3-all.zip Exclua o gradle3.3allzip e substitua-o baixando novamente neste site https: / /services.gradle.org/distributions/ Encontre o mesmo arquivo, faça o download e cole-o nesse local. Em seguida, sincronize seu projeto. Espero que funcione para você também.

Rahul Gupta
fonte