Como você limpa o cache do Apache Maven?

212

Recentemente, o Apache Maven parece estar tendo problemas de cache. A realização de instalações limpas em nossos projetos usando o Windows Vista ou o Windows 7 às vezes produz artefatos com os mesmos dados de uma compilação anterior, mesmo que os arquivos do artefato mais recente devam ter sido atualizados.

Existe alguma maneira de limpar esse cache para forçar o maven a sempre acionar uma compilação limpa do artefato local que deve ser construído?

Em particular, estamos tendo problemas para criar um aplicativo da web com o plug-in war. A versão do Maven é 3.0.3. A versão do plugin War é 2.1.1.

MetroidFan2002
fonte
2
Você já tentou o -Usinalizador que atualizará os artefatos?
Amir Raminfar
2
Você pode dar mais detalhes? Os dependentes não estão sendo atualizados na guerra? Em caso afirmativo, os dependentes possuem versões do INSTANTÂNEO?
Raghuram
É um projeto de múltiplos módulos? Você verificou o número da versão dos módulos dependentes? Você poderia se reproduzir? mvn clean installcolocar os novos artefatos no repositório local?
palacsint
@ MetroidFan2002 Podemos ter uma resposta marcada aqui. Ou você pode escrever uma solução se tiver encontrado por conta própria.
Naman
1
mvn clean install -Dmaven.repo.local=/alternate/repo/location
Gayan Weerakutti

Respostas:

225

Exclua os artefatos (ou o repositório local completo) c:\Users\<username>\.m2\repositorymanualmente.

palacsint
fonte
4
Tentei isso já, não funcionou. Obrigado pela sugestão embora.
MetroidFan2002
3
parece que, mesmo após a reinicialização, um pedaço de um monte de artefatos Maven têm alças para eles:The action can't be completed because the folder or file in it is open in another program. Close the folder or file and try again.
liltitus27
1
Observe que o local da pasta pode variar em seu sistema - consulte esta resposta para saber como obter o caminho da pasta de reporte do maven
jakub.g
9
@ liltitus27 mesmo aqui, apenas acabando com ~ / .m2 / repositório não funcionou, mvn dependency:purge-local-repositoryfinalmente funcionou
qbert65536
sim este trabalhou para mim 100% - Windows 10 em uma rede corporativa como um usuário não administrador
Graeme Phillips
176

Para limpar o cache local, tente usar o plug-in de dependência.

  1. mvn dependency:purge-local-repository: Esta é uma tentativa de excluir os arquivos do repositório local, mas ele sempre vai e preenche o repositório local depois que as coisas são removidas.
  2. mvn dependency:purge-local-repository -DreResolve=false: Isso evita a resolução das dependências, mas parece ainda ir à rede às vezes.
  3. mvn dependency:purge-local-repository -DactTransitively=false -DreResolve=false: Isso foi adicionado por Paweł Prażak e parece funcionar bem. Eu usaria o terceiro se você quiser que o repositório local seja esvaziado, e o primeiro se você quiser apenas jogar fora o repositório local e obter as dependências novamente.
Brian C.
fonte
4
qual a diferença entre eles?
Pieter De Bie
13
A primeira é uma tentativa de excluir os arquivos do repositório local, mas sempre vai e preenche o repositório local depois que as coisas são removidas. O segundo evita a re-resolução das dependências, mas parece ainda ir à rede às vezes. O terceiro foi adicionado por Paweł Prażak e parece funcionar bem. Eu usaria o terceiro se você quiser que o repositório local seja esvaziado, e o primeiro se você quiser apenas jogar fora o repositório local e obter as dependências novamente.
Brian C.
Na linha de comando em um sistema Linux. Você precisará instalar o mvn. maven.apache.org/install.html
Brian C.
Acrescentarei que você pode direcionar grupos / artefatos específicos com um parâmetro adicional. Esta resposta é definitivamente o que eu estava procurando (opção 3). Aqui está esse parâmetro extra ::: dependência do mvn: purge-local-repository -DmanualInclude = "myGroupId" -DsnapshotsOnly = true -DactTransitively = false -DreResolve = false
granadaCoder
Tentei a terceira opção com o objetivo de excluir todo o conteúdo do repositório local , mas ele não funciona - até esse momento, a maneira única de atingir esse objetivo é excluir manualmente todo o conteúdo desse diretório. Eu tenho o repositório local em um local diferente do <User_Name>/.m2local. Não tenho certeza se seria o motivo.
Manuel Jordan
13

Você verificou / alterou as configurações de updatePolicy para seus repositórios no seu settings.xml.

Este elemento especifica com que frequência as atualizações devem tentar ocorrer. O Maven comparará o registro de data e hora do POM local (armazenado no arquivo de metadados do repositório) com o controle remoto. As opções são: sempre, diariamente (padrão), intervalo: X (onde X é um número inteiro em minutos) ou nunca.

Tente configurá-lo para always.

FrVaBe
fonte
1
Ajuda possível para anway lidar com isso ... eu não tenho <updatePolicy>no meu pom.xml, mas não há<snapshotPolicy>
Al Lelopath
updatePolicy está definido para sempre em todos os lugares em meu settings.xml.
MasterJoe2 26/08/18
11

Eu faria o seguinte:

mvn dependency:purge-local-repository -DactTransitively=false -DreResolve=false --fail-at-end

Os sinalizadores informam ao maven para não tentar resolver dependências ou acessar a rede. Exclua o que você vê localmente.

E, por uma boa medida, ignore os erros ( --fail-at-end) até o fim. Às vezes, isso é útil para projetos que possuem um conjunto de dependências um tanto bagunçado ou dependem de um repositório interno um tanto bagunçado (isso acontece).

luis.espinal
fonte
1
Não é suficiente simplesmente excluir a pasta de cache local para essa limpeza?
1
Você poderia se conhecer todas as dependências transitivas. Mas isso se torna entediante (ou podemos simplesmente excluir o cache inteiro, mas isso forçará o maven a fazer o download de tudo novamente para coisas não relacionadas ao artefato em questão.) Tudo depende das especificidades da situação.
luis.espinal 30/03
6

Isso funciona no Spring Tool Suite v 3.1.0.RELEASE, mas acho que também está disponível no Eclipse.

Depois de excluir os artefatos manualmente (conforme declarado por palacsint acima) no /username/.m2diretório, indexe novamente os arquivos da seguinte maneira:

Vamos para:

  • Windows->Preferences->Maven->User Settings cardápio.

Clique no Reindexbotão ao lado da Local Repositorycaixa de texto. Clique em "Aplicar" e depois em "OK" e pronto.

Felby
fonte
2

Como algumas respostas apontaram, às vezes você realmente deseja excluir completamente o repositório local, por exemplo, pode haver alguns artefatos que não podem ser eliminados, pois não são mais referenciados pelo pom.

Se você deseja incorporar essa exclusão em uma fase de preparação, por exemplo, cleanvocê pode usar maven-clean-plugine acessar o repositório através das configurações, por exemplo:

 <plugin>
    <inherited>false</inherited>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.1</version>
    <executions>
        <execution>
            <phase>clean</phase>
            <goals>
                <goal>run</goal>
            </goals>
            <configuration>
                <tasks>
                    <echo>Base clean is attached to deleting local maven cache</echo>
                    <echo>${settings.localRepository}</echo>
                </tasks>
            </configuration>
        </execution>
    </executions>
</plugin>

<plugin>
    <inherited>false</inherited>
    <artifactId>maven-clean-plugin</artifactId>
    <version>3.1.0</version>
    <configuration>
        <filesets>
            <fileset>
                <directory>${settings.localRepository}</directory>
            </fileset>
        </filesets>
    </configuration>
</plugin>
Maximilian Schulz
fonte
2

Use mvn dependency:purge-local-repository -DactTransitively=false -Dskip=truese você tiver plug-ins maven como um dos módulos. Caso contrário, o Maven tentará recompilá-los, baixando as dependências novamente.

PedoDorf
fonte
1
Isso na verdade o que eu estava procurando, só tem um erro de digitação (faltando um traço para ignorar): dependência do mvn: purge-local-repository -DactTransitively = false -Dskip = true
shoguren
0

Eu tive esse mesmo problema e escrevi um shell de uma linha para fazer isso.

rm -rf $(mvn help:evaluate -Dexpression=settings.localRepository\
                       -Dorg.slf4j.simpleLogger.defaultLogLevel=WARN -B \
                       -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn | grep -vF '[INFO]')/*

Eu fiz isso como uma única linha, porque queria ter um projeto Jenkins para simplesmente executar isso sempre que necessário, para não precisar fazer logon nas coisas etc. Se você se permitir um script de shell para ele, você pode escrever mais limpo:

#!/usr/bin/env bash
REPOSITORY=$(mvn help:evaluate \
  -Dexpression=settings.localRepository \
  -Dorg.slf4j.simpleLogger.defaultLogLevel=WARN \
  -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn \
  --batch-mode \
  | grep -vF '[INFO]')

rm -rf $REPOSITORY/*

Deve funcionar, mas não testei todo esse script. (Testei o primeiro comando, mas não o script inteiro.) Essa abordagem tem a desvantagem de executar um comando grande e complicado primeiro. É idempotente, para que você possa testá-lo por si mesmo. A exclusão é seu próprio comando posteriormente, e isso permite que você tente tudo e verifique se faz o que pensa, porque não deve confiar nos comandos de exclusão sem verificação. No entanto, é inteligente por um bom motivo: é portátil. Ele respeita seu arquivo settings.xml. Se você estiver executando este comando e instruir o maven a usar um arquivo xml específico (o argumento -s ou --settings), isso ainda funcionará. Então você não precisa se preocupar em garantir que tudo seja o mesmo em todos os lugares.

É um pouco pesado, mas é uma maneira decente de fazer negócios, IMO.

Haakon Løtveit
fonte
-3

Portanto, existem alguns comandos que você pode usar para limpar

 1. mvn clean cache   
 2. mvn clean install 
 3. mvn clean install -Pclean-database

também excluir a pasta do repositório de .m2 pode ajudar.

Codiee
fonte
1
O que o "mvn clean cache" deve fazer? Não parece ser um comando reconhecido para mim.
AMTerp