Come si cancella la cache di Apache Maven?


213

Recentemente, Apache Maven sembra avere problemi di memorizzazione nella cache. L'esecuzione di installazioni pulite sui nostri progetti utilizzando Windows Vista o Windows 7 a volte produce artefatti con gli stessi dati di una build precedente anche se i file degli artefatti più recenti avrebbero dovuto essere aggiornati.

Esiste un modo per svuotare questa cache per forzare Maven a innescare sempre una build pulita del manufatto locale che dovrebbe essere costruito?

In particolare, stiamo riscontrando problemi nella creazione di una webapp con il plugin di guerra. La versione di Maven è 3.0.3. La versione del plugin di guerra è 2.1.1.


2
Hai provato la -Ubandiera che aggiornerà gli artefatti?
Amir Raminfar,

2
Puoi fornire maggiori dettagli? Le persone a carico non vengono aggiornate in guerra? In tal caso, le persone a carico hanno versioni SNAPSHOT?
Raghuram,

È un progetto multimodulo? Hai controllato il numero di versione dei moduli dipendenti? Potresti riprodurre? mvn clean installmettere i nuovi artefatti nel repository locale?
palacsint,

@ MetroidFan2002 Possiamo per favore avere una risposta contrassegnata qui. Oppure puoi scrivere una soluzione se ne hai trovata una da solo.
Naman,

1
mvn clean install -Dmaven.repo.local=/alternate/repo/location
Gayan Weerakutti,

Risposte:


226

Elimina c:\Users\<username>\.m2\repositorymanualmente gli artefatti (o l'intero repo locale) .


4
Ho già provato, non ha funzionato. Grazie per il suggerimento però.
MetroidFan2002,

3
sembra che, anche dopo un riavvio, un diavolo di molti manufatti malvagi abbia delle maniglie: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
Nota che la posizione della cartella potrebbe variare sul tuo sistema - vedi questa risposta per come ottenere il percorso della cartella repo di
maven

9
@Liltitus27 stesso qui, semplicemente cancellando ~ / .m2 / repository non ha funzionato, mvn dependency:purge-local-repositoryfinalmente ha funzionato
qbert65536

sì, questo ha funzionato per me al 100% - Windows10 su una rete aziendale come utente non amministratore
Graeme Phillips

176

Per pulire la cache locale, provare a utilizzare il plug-in di dipendenza.

  1. mvn dependency:purge-local-repository: Questo è un tentativo di eliminare i file del repository locale ma va sempre a riempire il repository locale dopo che le cose sono state rimosse.
  2. mvn dependency:purge-local-repository -DreResolve=false: Questo evita la ricollegamento delle dipendenze ma a volte sembra ancora andare alla rete.
  3. mvn dependency:purge-local-repository -DactTransitively=false -DreResolve=false: Questo è stato aggiunto da Paweł Prażak e sembra funzionare bene. Vorrei utilizzare il terzo se si desidera svuotare il repository locale e il primo se si desidera semplicemente eliminare il repository locale e ottenere nuovamente le dipendenze.

4
qual è la differenza tra loro?
Pieter De Bie,

13
Il primo è un tentativo di eliminare i file del repository locale ma va sempre a riempire il repository locale dopo che le cose sono state rimosse. Il secondo evita la ricollegamento delle dipendenze, ma a volte sembra ancora andare alla rete. Il terzo è stato aggiunto da Paweł Prażak e sembra funzionare bene. Vorrei utilizzare il terzo se si desidera svuotare il repository locale e il primo se si desidera semplicemente eliminare il repository locale e ottenere nuovamente le dipendenze.
Brian C.

Dalla riga di comando su un sistema Linux. Dovrai installare mvn. maven.apache.org/install.html
Brian C.

Aggiungerò che puoi scegliere come target gruppi / artefatti specifici con un parametro aggiuntivo. Questa risposta è sicuramente ciò che stavo cercando (opzione 3). Ecco quel parametro aggiuntivo ::: dipendenza mvn: purge-local-repository -DmanualInclude = "myGroupId" -DsnapshotsOnly = true -DactTransitively = false -DreResolve = false
granadaCoder

Ho provato la terza opzione con lo scopo di eliminare tutti i contenuti all'interno del repository locale , ma non funziona - fino a questo punto il modo unico per raggiungere questo obiettivo è eliminare manualmente tutti i contenuti di quella directory. Ho il repository locale in una posizione diversa rispetto alla <User_Name>/.m2posizione. Non sono sicuro se sarebbe il motivo.
Manuel Jordan,

13

Hai controllato / modificato le impostazioni updatePolicy per i tuoi repository nel tuo settings.xml.

Questo elemento specifica la frequenza con cui gli aggiornamenti dovrebbero tentare di verificarsi. Maven confronterà il timestamp del POM locale (memorizzato nel file dei metadati di un repository) con il telecomando. Le scelte sono: sempre, giornaliero (impostazione predefinita), intervallo: X (dove X è un numero intero in minuti) o mai.

Prova a impostarlo su always.


1
Un possibile aiuto per risolvere questo problema ... Non ho <updatePolicy>nel mio pom.xml, ma c'è<snapshotPolicy>
Al Lelopath,

updatePolicy è sempre impostato ovunque in my settings.xml.
MasterJoe2,

11

Vorrei fare quanto segue:

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

I flag indicano a Maven di non tentare di risolvere dipendenze o colpire la rete. Elimina ciò che vedi localmente.

E per buona misura, ignora gli errori ( --fail-at-end) fino alla fine. Questo a volte è utile per i progetti che hanno un set di dipendenze un po 'incasinato o si basano su un repository interno un po' incasinato (succede.)


1
Non è sufficiente eliminare semplicemente la cartella della cache locale per questo tipo di pulizia?

1
Potresti se conosci ogni singola dipendenza transitiva. Ma poi diventa noioso (o potremmo semplicemente eliminare l'intera cache, ma questo costringerà Mavven a scaricare di nuovo tutto per cose non correlate al manufatto in questione.) Tutto dipende dalle specifiche della situazione.
luis.espinal

6

Funziona su Spring Tool Suite v 3.1.0.RELEASE, ma suppongo sia disponibile anche su Eclipse.

Dopo aver eliminato gli artefatti a mano (come indicato da palacsint sopra) nella /username/.m2directory, reindicizzare i file procedendo come segue:

Vai a:

  • Windows->Preferences->Maven->User Settings menù.

Fai clic sul Reindexpulsante accanto alla Local Repositorycasella di testo. Fai clic su "Applica", quindi su "OK" e il gioco è fatto.


2

Come hanno sottolineato alcune risposte, a volte si desidera veramente eliminare completamente il repository locale, ad esempio, potrebbero esserci alcuni artefatti che non possono essere eliminati in quanto non sono più indicati dal pom.

Se si desidera che questa eliminazione sia incorporata in una fase maven, come ad esempio cleanè possibile utilizzare maven-clean-plugine accedere al repository tramite le impostazioni, ad esempio:

 <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>

2

Utilizzare mvn dependency:purge-local-repository -DactTransitively=false -Dskip=truese si hanno plug-in Mven come uno dei moduli. Altrimenti Maven proverà a ricompilarli, scaricando di nuovo le dipendenze.


1
Questo in realtà quello che stavo cercando, ha solo un refuso (manca un trattino per saltare): dipendenza mvn: purge-local-repository -DactTransitively = false -Dskip = true
shoguren

0

Ho avuto lo stesso problema e ho scritto una riga in shell per farlo.

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]')/*

L'ho fatto come one-liner perché volevo avere un progetto Jenkins per eseguirlo semplicemente ogni volta che ne avevo bisogno, quindi non avrei dovuto accedere a cose, ecc. Se ti permettessi uno script shell per questo, puoi scriverlo più pulito:

#!/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/*

Dovrebbe funzionare, ma non ho testato tutto quello script. (Ho testato il primo comando, ma non l'intero script.) Questo approccio ha il rovescio della medaglia di eseguire prima un grosso comando complicato. È idempotente, quindi puoi provarlo tu stesso. L'eliminazione è il suo comando in seguito, e questo ti consente di provare tutto e verificare che fa quello che pensi che faccia, perché non dovresti fidarti dei comandi di eliminazione senza verifica. Tuttavia, è intelligente per una buona ragione: è portatile. Rispetta il tuo file settings.xml. Se stai eseguendo questo comando e dici a maven di usare un file xml specifico (l'argomento -s o --settings), funzionerà comunque. Quindi non devi giocherellare assicurandoti che tutto sia uguale ovunque.

È un po 'maneggevole, ma è un modo decente di fare affari, IMO.


-3

Quindi ci sono alcuni comandi che è possibile utilizzare per la pulizia

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

anche l'eliminazione della cartella del repository da .m2 può aiutare.


1
Cosa dovrebbe fare "mvn clean cache"? Non sembra essere un comando riconosciuto per me.
AMTerp
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.