¿Cómo se borra el caché de Apache Maven?

213

Recientemente, Apache Maven parece estar teniendo problemas de almacenamiento en caché. Realizar instalaciones limpias en nuestros proyectos con Windows Vista o Windows 7 a veces produce artefactos con los mismos datos que una compilación anterior, aunque los archivos del artefacto más nuevo deberían haberse actualizado.

¿Hay alguna manera de borrar este caché para obligar a Maven a desencadenar siempre una construcción limpia del artefacto local que se debe construir?

En particular, tenemos problemas para crear una aplicación web con el complemento de guerra. La versión de Maven es 3.0.3. La versión del complemento War es 2.1.1.

MetroidFan2002
fuente
2
¿Has probado la -Ubandera que actualizará los artefactos?
Amir Raminfar
2
¿Puedes dar más detalles? ¿Los dependientes no se actualizan en la guerra? Si es así, ¿los dependientes tienen versiones SNAPSHOT?
Raghuram
¿Es un proyecto multimódulo? ¿Ha verificado el número de versión de los módulos depdendent? ¿Podrías reproducir? mvn clean installponer los nuevos artefactos en el repositorio local?
palacsint
@ MetroidFan2002 ¿Podemos tener una respuesta marcada aquí? O puede escribir una solución si encontró alguna por su cuenta.
Naman
1
mvn clean install -Dmaven.repo.local=/alternate/repo/location
Gayan Weerakutti

Respuestas:

226

Elimine los artefactos (o el repositorio local completo) a c:\Users\<username>\.m2\repositorymano.

palacsint
fuente
44
Intenté eso ya, no funcionó. Gracias por la sugerencia sin embargo.
MetroidFan2002
3
parece que, incluso después de un reinicio, una diablos de un montón de artefactos Maven tiene asas para ellos: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
Tenga en cuenta que la ubicación de la carpeta puede variar en su sistema - ver esta respuesta de cómo obtener el repositorio Maven ruta de carpeta
jakub.g
9
@ liltitus27 igual aquí, simplemente eliminar ~ / .m2 / repositorio no funcionó, mvn dependency:purge-local-repositoryfinalmente funcionó
qbert65536
sí, esto funcionó para mí al 100% - Windows10 en una red corporativa como usuario no administrador
Graeme Phillips
176

Para limpiar la memoria caché local, intente usar el complemento de dependencia.

  1. mvn dependency:purge-local-repository: Este es un intento de eliminar los archivos del repositorio local, pero siempre va y llena el repositorio local después de que se hayan eliminado las cosas.
  2. mvn dependency:purge-local-repository -DreResolve=false: Esto evita que se vuelvan a resolver las dependencias, pero a veces parece que todavía va a la red.
  3. mvn dependency:purge-local-repository -DactTransitively=false -DreResolve=false: Esto fue agregado por Paweł Prażak y parece funcionar bien. Usaría el tercero si desea que se vacíe el repositorio local, y el primero si solo desea tirar el repositorio local y obtener las dependencias nuevamente.
Brian C.
fuente
44
¿cual es la diferencia entre ellos?
Pieter De Bie
13
El primero es un intento de eliminar los archivos del repositorio local, pero siempre va y llena el repositorio local después de que se hayan eliminado las cosas. El segundo evita la resolución de las dependencias, pero a veces parece que todavía va a la red. Tercero fue agregado por Paweł Prażak y parece funcionar bien. Usaría el tercero si desea que se vacíe el repositorio local, y el primero si solo desea tirar el repositorio local y obtener las dependencias nuevamente.
Brian C.
Desde la línea de comandos en un sistema Linux. Deberá instalar mvn. maven.apache.org/install.html
Brian C.
Agregaré que puede apuntar a grupos / artefactos específicos con un parámetro adicional. Esta respuesta es definitivamente lo que estaba buscando (opción 3). Aquí está ese parámetro adicional ::: dependencia mvn: purge-local-repository -DmanualInclude = "myGroupId" -DsnapshotsOnly = true -DactTransitively = false -DreResolve = false
granadaCoder
Intenté la tercera opción con el propósito de eliminar todos los contenidos dentro del repositorio local , pero no funciona, hasta este punto, la forma única de lograr este objetivo es eliminar manualmente todos los contenidos de ese directorio. Tengo el repositorio local en una ubicación diferente a la <User_Name>/.m2ubicación. No estoy seguro si sería la razón.
Manuel Jordan
13

¿Ha verificado / cambiado la configuración de UpdatePolicy para sus repositorios en su settings.xml.

Este elemento especifica con qué frecuencia deberían intentarse las actualizaciones. Maven comparará la marca de tiempo del POM local (almacenada en un archivo de metadatos maven de un repositorio) con el control remoto. Las opciones son: siempre, diariamente (predeterminado), intervalo: X (donde X es un número entero en minutos) o nunca.

Intenta configurarlo always.

FrVaBe
fuente
1
Posible ayuda para lidiar con esto ... No tengo <updatePolicy>en mi pom.xml, pero hay<snapshotPolicy>
Al Lelopath
updatePolicy está configurado para siempre en todas partes en mi settings.xml.
MasterJoe2
11

Yo haría lo siguiente:

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

Las banderas le dicen a maven que no intente resolver dependencias o golpear la red. Eliminar lo que ves localmente.

Y por si acaso, ignore los errores ( --fail-at-end) hasta el final. Esto a veces es útil para proyectos que tienen un conjunto de dependencias algo desordenado o que dependen de un repositorio interno algo desordenado (sucede).

luis.espinal
fuente
1
¿No es suficiente simplemente eliminar la carpeta de caché local para este tipo de limpieza?
1
Podría saber si conoce cada dependencia transitiva. Pero luego se vuelve tedioso (o podríamos eliminar todo el caché, pero eso obligará a Maven a descargar todo nuevamente para cosas no relacionadas con el artefacto en cuestión). Todo depende de los detalles de la situación.
luis.espinal
6

Esto funciona en Spring Tool Suite v 3.1.0.RELEASE, pero supongo que también está disponible en Eclipse.

Después de eliminar los artefactos a mano (como se indica en palacsint arriba) en el /username/.m2directorio, vuelva a indexar los archivos haciendo lo siguiente:

Ir:

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

Haga clic en el Reindexbotón al lado del Local Repositorycuadro de texto. Haga clic en "Aplicar", luego en "Aceptar" y listo.

Felby
fuente
2

Como algunas respuestas han señalado, a veces realmente desea eliminar el repositorio local por completo, por ejemplo, puede haber algunos artefactos que no se pueden purgar, ya que el pom ya no hace referencia a ellos.

Si desea tener esta eliminación incrustada en una fase maven, como por ejemplo clean, puede usar maven-clean-pluginy acceder al repositorio a través de la configuración, por ejemplo:

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

Úselo mvn dependency:purge-local-repository -DactTransitively=false -Dskip=truesi tiene complementos maven como uno de los módulos. De lo contrario, Maven intentará recompilarlos, descargando así las dependencias nuevamente.

PedoDorf
fuente
1
Esto es realmente lo que estaba buscando, solo tiene un error tipográfico (falta un guión para omitir): dependencia mvn: depuración-local-repositorio -DactTransitively = false -Dskip = true
shoguren
0

He tenido este mismo problema, y ​​escribí una línea en shell para hacerlo.

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

Lo hice de una sola vez porque quería tener un proyecto de Jenkins para ejecutar esto simplemente cuando lo necesitara, para no tener que iniciar sesión en cosas, etc. Si te permites un script de shell para ello, puedes escribirlo más limpio:

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

Debería funcionar, pero no he probado todo ese script. (He probado el primer comando, pero no el script completo). Este enfoque tiene la desventaja de ejecutar primero un comando grande y complicado. Es idempotente, por lo que puede probarlo usted mismo. La eliminación es su propio comando después, y esto le permite probarlo todo y comprobar que hace lo que cree que hace, porque no debe confiar en los comandos de eliminación sin verificación. Sin embargo, es inteligente por una buena razón: es portátil. Respeta su archivo settings.xml. Si está ejecutando este comando y le dice a maven que use un archivo xml específico (el argumento -s o --settings), esto seguirá funcionando. Por lo tanto, no tiene que jugar con asegurarse de que todo sea igual en todas partes.

Es un poco manejable, pero es una forma decente de hacer negocios, en mi opinión.

Haakon Løtveit
fuente
-3

Así que hay algunos comandos que puedes usar para limpiar

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

También puede ser útil eliminar la carpeta del repositorio de .m2.

Codiee
fuente
1
¿Qué se supone que debe hacer "mvn clean cache"? No parece ser un comando reconocido para mí.
AMTerp