J'ai trop de fichiers dans le dossier .m2 où maven stocke les dépendances téléchargées. Y a-t-il un moyen de nettoyer toutes les anciennes dépendances? Par exemple, s'il y a une dépendance avec 3 versions différentes: 1, 2 et 3, après le nettoyage il ne doit rester que la 3ème. Comment puis-je le faire pour toutes les dépendances dans le dossier .m2?
Réponses
Trop de publicités?J'ai créé un utilitaire et l'ai hébergé sur GitHub pour nettoyer les anciennes versions des bibliothèques du dépôt Maven local. L'utilitaire, lors de son exécution par défaut, supprime toutes les anciennes versions des artefacts ne laissant que les plus récentes. En option, il peut supprimer toutes les instantanés, les sources, les javadocs, et aussi les groupes ou les artefacts peuvent être forcés / exclus dans ce processus. Cette plateforme multiplateforme prend également en charge la suppression basée sur les dates de dernier accès / de téléchargement.
Je voulais aussi supprimer les anciennes dépendances de mon dépôt Maven. J'ai pensé simplement exécuter la réponse de Florian, mais je voulais quelque chose que je pourrais exécuter encore et encore sans me rappeler un long extrait de code linux, et je voulais quelque chose avec un peu de configurabilité -- plus un programme, moins une chaîne de commandes unix, alors j'ai pris l'idée de base et je l'ai transformée en un programme Ruby (relativement petit) qui supprime les anciennes dépendances en fonction de leur temps d'accès.
Ça ne supprime pas les "anciennes versions" mais comme vous pourriez en fait avoir deux projets actifs différents avec deux versions différentes d'une dépendance, cela n'aurait de toute façon pas fait ce que je voulais. Au lieu de cela, comme la réponse de Florian, cela supprime les dépendances qui n'ont pas été consultées récemment.
Si vous voulez l'essayer, vous pouvez :
- Visiter le dépôt GitHub
- Cloner le dépôt, ou télécharger le code source
- Inspecter optionnellement le code pour vous assurer qu'il n'est pas malveillant
- Exécuter
bin/mvnclean
Il y a des options pour remplacer le dépôt Maven par défaut, ignorer des fichiers, définir la date limite, mais vous pouvez les lire dans le README sur GitHub.
Je le mettrai probablement en tant que Ruby gem à un moment donné après avoir un peu plus travaillé dessus, ce qui simplifiera les choses (gem install mvnclean; mvnclean
) si vous avez déjà Ruby installé et fonctionnel.
Nettoyez simplement tout le contenu sous le dossier .m2-> repository. Lorsque vous construisez un projet, toutes les dépendances se chargent ici.
Dans votre cas, il se peut que votre projet utilisait auparavant une ancienne version de toute dépendance et que maintenant la version a été mise à jour. Il est donc préférable de nettoyer le dossier .m2 et de construire votre projet avec mvn clean install.
Maintenant, les dépendances avec les modules de la dernière version seront téléchargées dans ce dossier.
J'ai passé quelques heures à étudier ce problème et les réponses, dont bon nombre reposent sur le atime
(qui est le dernier accès sur les systèmes UNIX), ce qui est une solution peu fiable pour deux raisons:
- La plupart des systèmes UNIX (y compris Linux et macOS) mettent à jour le
atime
de manière irrégulière au mieux, et cela pour une raison: une implémentation complète duatime
impliquerait que l'ensemble du système de fichiers serait ralenti en devant mettre à jour (c'est-à-dire, écrire sur le disque) leatime
à chaque fois qu'un fichier est lu, de plus, un tel nombre extrême de mises à jour userait très rapidement les disques SSD modernes et performants - Dans un environnement CI/CD, la VM utilisée pour construire votre projet Maven restaurera son dépôt Maven à partir d'un stockage partagé, ce qui aura pour conséquence de définir le
atime
à une valeur "récente"
J'ai donc créé un nettoyeur de dépôt Maven et l'ai rendu disponible sur https://github.com/alitokmen/maven-repository-cleaner/. Le script Bash maven-repository-cleaner.sh
a une fonction, cleanDirectory
, qui est une fonction récursive parcourant le ~/.m2/repository/
et fait ce qui suit:
- Lorsque le sous-répertoire n'est pas un numéro de version, il creuse dans ce sous-répertoire pour l'analyser
- Lorsqu'un répertoire a des sous-répertoires qui semblent être des numéros de version, il ne supprime que toutes les versions inférieures
En pratique, si vous avez une hiérarchie telle que:
groupe-d'artefacts
nom-d'artefact
1.8
1.10
1.2
... le script maven-repository-cleaner.sh
fera:
- Naviguer vers
groupe-d'artefacts
- Dans
groupe-d'artefacts
, naviguer versnom-d'artefact
- Dans
nom-d'artefact
, supprimer les sous-répertoires1.8
et1.2
, car1.10
est supérieur à à la fois1.2
et1.8
C'est donc très similaire aux solutions fournies par Andronicus et Pavan Kumar, la différence étant que celui-ci est écrit en tant que script Shell. Pour exécuter l'outil sur votre plateforme CI/CD (ou tout autre système UNIX), utilisez simplement les trois lignes suivantes, soit au début, soit à la fin de la construction:
wget https://raw.githubusercontent.com/alitokmen/maven-repository-cleaner/main/maven-repository-cleaner.sh
chmod +x maven-repository-cleaner.sh
./maven-repository-cleaner.sh
Vous devez copier la dépendance dont vous avez besoin pour le projet. Une fois celles-ci en main, veuillez supprimer toutes les balises intégrées dans la balise du fichier POM.XML de votre projet.
Après avoir enregistré le fichier, vous ne verrez pas les Dépendances Maven dans vos Librairies
. Ensuite, veuillez coller les que vous avez copiées plus tôt.
Les jars nécessaires seront automatiquement téléchargés par Maven, vous pourrez le constater également dans les Dépendances Maven générées Librairies
après enregistrement du fichier.
Merci.
- Réponses précédentes
- Plus de réponses