Comment effacez-vous le cache d'Apache Maven?

213

Récemment, Apache Maven semble avoir des problèmes de mise en cache. Effectuer des installations propres sur nos projets à l'aide de Windows Vista ou Windows 7 produit parfois des artefacts avec les mêmes données qu'une génération précédente même si les fichiers de l'artefact plus récents auraient dû être mis à jour.

Existe-t-il un moyen de vider ce cache pour forcer maven à toujours déclencher une génération propre de l'artefact local qui doit être construit?

En particulier, nous rencontrons des problèmes pour créer une application Web avec le plugin War. La version Maven est 3.0.3. La version du plugin War est 2.1.1.

MetroidFan2002
la source
2
Avez-vous essayé le -Udrapeau qui mettra à jour les artefacts?
Amir Raminfar
2
Pouvez-vous donner plus de détails? Les personnes à charge ne sont-elles pas mises à jour pendant la guerre? Si oui, les personnes à charge ont-elles des versions INSTANTANÉES?
Raghuram
Est-ce un projet multimodule? Avez-vous vérifié le numéro de version des modules dépendants? Pourriez-vous reproduire? mvn clean installmettre les nouveaux artefacts dans le référentiel local?
palacsint
@ MetroidFan2002 Pouvons-nous s'il vous plaît avoir une réponse marquée ici. Ou vous pouvez écrire une solution si vous en avez trouvé vous-même.
Naman
1
mvn clean install -Dmaven.repo.local=/alternate/repo/location
Gayan Weerakutti

Réponses:

226

Supprimez les artefacts (ou le référentiel local complet) à la c:\Users\<username>\.m2\repositorymain.

palacsint
la source
4
J'ai déjà essayé, ça n'a pas marché. Merci pour la suggestion.
MetroidFan2002
3
il semble que, même après un redémarrage, de nombreux artefacts mavens aient des poignées: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
Notez que l'emplacement du dossier peut varier sur votre système - voir cette réponse pour savoir comment obtenir le chemin du dossier de
dépôt maven
9
@ liltitus27 même ici, l'effacement de ~ / .m2 / repository n'a pas fonctionné, a mvn dependency:purge-local-repositoryfinalement fonctionné
qbert65536
oui, cela a fonctionné pour moi à 100% - Windows10 sur un réseau d'entreprise en tant qu'utilisateur non administrateur
Graeme Phillips
176

Pour nettoyer le cache local, essayez d'utiliser le plug-in de dépendance.

  1. mvn dependency:purge-local-repository: Il s'agit d'une tentative de suppression des fichiers du référentiel local, mais cela va toujours et remplit le référentiel local une fois les éléments supprimés.
  2. mvn dependency:purge-local-repository -DreResolve=false: Cela évite la re-résolution des dépendances mais semble aller parfois au réseau.
  3. mvn dependency:purge-local-repository -DactTransitively=false -DreResolve=false: Ceci a été ajouté par Paweł Prażak et semble bien fonctionner. J'utiliserais le troisième si vous voulez que le dépôt local soit vidé, et le premier si vous voulez simplement jeter le dépôt local et récupérer à nouveau les dépendances.
Brian C.
la source
4
quelle est la différence entre eux?
Pieter De Bie
13
Le premier est une tentative de suppression des fichiers du référentiel local, mais il va toujours et remplit le référentiel local une fois les éléments supprimés. Le second évite la re-résolution des dépendances mais semble aller parfois au réseau. Le troisième a été ajouté par Paweł Prażak et semble bien fonctionner. J'utiliserais le troisième si vous voulez que le dépôt local soit vidé, et le premier si vous voulez simplement jeter le dépôt local et récupérer à nouveau les dépendances.
Brian C.
Depuis la ligne de commande sur un système Linux. Vous devrez installer mvn. maven.apache.org/install.html
Brian C.
J'ajouterai que vous pouvez cibler des groupes / artefacts spécifiques avec un paramètre supplémentaire. Cette réponse est certainement ce que je cherchais (option 3). Voici ce paramètre supplémentaire ::: dépendance mvn: purge-local-repository -DmanualInclude = "myGroupId" -DsnapshotsOnly = true -DactTransitively = false -DreResolve = false
granadaCoder
J'ai essayé la 3e option dans le but de supprimer tout le contenu du référentiel local , mais cela ne fonctionne pas - jusqu'à ce point, la façon unique d'atteindre cet objectif est de supprimer manuellement tout le contenu de ce répertoire. J'ai le référentiel local dans un emplacement différent de l' <User_Name>/.m2emplacement. Je ne sais pas si ce serait la raison.
Manuel Jordan
13

Avez-vous vérifié / modifié les paramètres updatePolicy pour vos référentiels dans votre settings.xml.

Cet élément spécifie la fréquence à laquelle les mises à jour doivent tenter de se produire. Maven comparera l'horodatage du POM local (stocké dans le fichier de métadonnées maven d'un référentiel) à la télécommande. Les choix sont: toujours, quotidien (par défaut), intervalle: X (où X est un entier en minutes) ou jamais.

Essayez de le régler sur always.

FrVaBe
la source
1
Aide possible pour résoudre ce problème ... Je n'ai pas <updatePolicy>dans mon pom.xml, mais il y a<snapshotPolicy>
Al Lelopath
updatePolicy est défini sur toujours partout dans mon settings.xml.
MasterJoe2
11

Je ferais ce qui suit:

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

Les drapeaux indiquent à maven de ne pas essayer de résoudre les dépendances ou de frapper le réseau. Supprimez ce que vous voyez localement.

Et pour faire bonne mesure, ignorez les erreurs ( --fail-at-end) jusqu'à la fin. Cela est parfois utile pour les projets qui ont un ensemble de dépendances quelque peu foiré ou qui s'appuient sur un référentiel interne quelque peu foiré (cela arrive).

luis.espinal
la source
1
N'est-ce pas suffisant de simplement supprimer le dossier de cache local pour ce genre de nettoyage?
1
Vous pourriez le faire si vous connaissez chaque dépendance transitive unique. Mais cela devient fastidieux (ou nous pourrions simplement supprimer tout le cache, mais cela forcera maven à tout télécharger à nouveau pour des choses sans rapport avec l'artefact en question.) Tout dépend des spécificités de la situation.
luis.espinal
6

Cela fonctionne sur Spring Tool Suite v 3.1.0.RELEASE, mais je suppose qu'il est également disponible sur Eclipse.

Après avoir supprimé les artefacts à la main (comme indiqué par palacsint ci-dessus) dans le /username/.m2répertoire, ré-indexez les fichiers en procédant comme suit:

Aller à:

  • Windows->Preferences->Maven->User Settings menu.

Cliquez sur le Reindexbouton à côté de la zone de Local Repositorytexte. Cliquez sur "Appliquer" puis "OK" et vous avez terminé.

Felby
la source
2

Comme certaines réponses l'ont souligné, parfois vous voulez vraiment supprimer complètement le référentiel local, par exemple, il peut y avoir des artefacts qui ne peuvent pas être purgés car ils ne sont plus référencés par le pom.

Si vous souhaitez que cette suppression soit intégrée dans une phase maven, comme par exemple, cleanvous pouvez utiliser le maven-clean-pluginet accéder au référentiel via les paramètres, par exemple:

 <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
la source
2

Utilisez mvn dependency:purge-local-repository -DactTransitively=false -Dskip=truesi vous avez des plugins maven comme l'un des modules. Sinon, Maven essaiera de les recompiler, téléchargeant ainsi à nouveau les dépendances.

PedoDorf
la source
1
C'est en fait ce que je cherchais, il y a juste une faute de frappe (manque un tiret pour sauter): dépendance mvn: purge-local-repository -Dact Transitively = false -Dskip = true
shoguren
0

J'ai eu ce même problème, et j'ai écrit une doublure en coque pour le faire.

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

Je l'ai fait en une seule ligne parce que je voulais avoir un projet Jenkins pour simplement l'exécuter à tout moment, donc je n'aurais pas à me connecter à des trucs, etc. Si vous vous permettez un script shell pour cela, vous pouvez l'écrire plus propre:

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

Devrait fonctionner, mais je n'ai pas testé tout ce script. (J'ai testé la première commande, mais pas le script entier.) Cette approche a l'inconvénient d'exécuter d'abord une grande commande compliquée. Il est idempotent, vous pouvez donc le tester par vous-même. La suppression est sa propre commande par la suite, et cela vous permet de tout essayer et de vérifier qu'elle fait ce que vous pensez qu'elle fait, car vous ne devez pas faire confiance aux commandes de suppression sans vérification. Cependant, il est intelligent pour une bonne raison: il est portable. Il respecte votre fichier settings.xml. Si vous exécutez cette commande et dites à maven d'utiliser un fichier xml spécifique (l'argument -s ou --settings), cela fonctionnera toujours. Vous n'avez donc pas besoin de jouer pour vous assurer que tout est le même partout.

C'est un peu maniable, mais c'est une façon décente de faire des affaires, OMI.

Haakon Løtveit
la source
-3

Il y a donc quelques commandes que vous pouvez utiliser pour le nettoyage

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

la suppression du dossier du référentiel de .m2 peut également vous aider.

Codiee
la source
1
Que doit faire "mvn clean cache"? Cela ne semble pas être une commande reconnue pour moi.
AMTerp