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?Si vous êtes sur Unix, vous pourriez utiliser l'heure d'accès des fichiers. Il suffit d'activer l'heure d'accès pour votre système de fichiers, puis d'effectuer une construction propre de tous vos projets pour lesquels vous souhaitez conserver les dépendances, puis de faire quelque chose comme ceci (NON TESTÉ!) :
find ~/.m2 -amin +5 -iname '*.pom' | while read pom; do parent=`dirname "$pom"`; rm -Rf "$parent"; done
Cela trouvera tous les fichiers *.pom qui ont été consultés il y a plus de 5 minutes (en supposant que vous avez lancé vos constructions il y a au maximum 5 minutes) et supprimera leurs répertoires.
Ajoutez "echo" avant le rm pour effectuer une 'simulation'.
Étant donné un fichier POM pour un projet Maven, vous pouvez supprimer toutes ses dépendances dans le dépôt local (par défaut ~/.m2/respository) en utilisant le Plugin de Dépendances Apache Maven.
Il inclut la fonctionnalité dependency:purge-local-repository
qui supprime les dépendances du projet du dépôt local, et éventuellement les ré-résout.
Pour nettoyer les dépendances locales, vous devez simplement utiliser le paramètre optionnel reResolve et le mettre à false car il est par défaut à true.
Cette commande ligne devrait fonctionner :
mvn dependency:purge-local-repository -DreResolve=false
Réponse courte - Supprimé le dossier .m2 dans {user.home}
. Par exemple, dans Windows 10, le dossier utilisateur est C:\Utilisateurs\utilisateur1
. Reconstruisez votre projet en utilisant mvn clean package
. Seules les dépendances nécessaires au projet subsisteront.
Réponse longue - Le dossier .m2 est juste comme un dossier normal et le contenu du dossier est construit à partir de différents projets. Je pense qu'il n'y a pas de moyen de déterminer automatiquement quelle bibliothèque est "ancienne". En fait, "ancien" est un mot vague. Il pourrait y avoir de nombreuses raisons pour lesquelles une version antérieure d'une bibliothèque est utilisée dans un projet, donc il n'est pas possible de déterminer laquelle n'est pas utilisée.
Tout ce que vous pourriez faire, c'est de supprimer le dossier .m2 et de reconstruire tous vos projets, puis le dossier se reconstruirait automatiquement avec toutes les bibliothèques requises.
Si vous êtes préoccupé par l'utilisation d'une version particulière d'une bibliothèque dans tous les projets ; il est important que le POM du projet soit également mis à jour vers la dernière version. C'est-à-dire que si différents POMs font référence à différentes versions de la bibliothèque, toutes seront téléchargées dans .m2.
-
Téléchargez toutes les dépendances actuelles de vos projets
find your-projects-dir -name pom.xml -exec mvn -f '{}' dependency:resolve
-
Déplacez votre dépôt maven local vers un emplacement temporaire
mv ~/.m2 ~/saved-m2
-
Renommez tous les fichiers maven-metadata-central.xml* du dépôt sauvegardé en maven-metadata.xml*
find . -type f -name "maven-metadata-central.xml*" -exec rename -v -- 's/-central//' '{}' \;
-
Pour configurer la copie modifiée du dépôt local en tant que miroir, créez le répertoire ~/.m2 et le fichier ~/.m2/settings.xml avec le contenu suivant (remplacez user par votre nom d'utilisateur) :
mycentral My Central file:/home/user/saved-m2/ central
-
Résolvez à nouveau les dépendances de vos projets :
find your-projects-dir -name pom.xml -exec mvn -f '{}' dependency:resolve
-
Vous avez maintenant un dépôt maven local avec le minimum d'artefacts nécessaires. Supprimez le miroir local du fichier de configuration et du système de fichiers.
Cela fait plus de 6 ans que cette question a été posée, mais je n'ai toujours pas trouvé d'outil pour nettoyer efficacement mon référentiel. J'ai donc écrit le mien en Python pour me débarrasser des anciens artefacts locaux. Peut-être que cela sera utile pour quelqu'un d'autre aussi :
repo-cleaner.py
:
from os.path import isdir
from os import listdir
import shutil
import semver
import Constants
# Changer à True pour obtenir un journal de ce qui sera supprimé
dry_run = False
def check_and_clean(path):
files = listdir(path)
only_files = True
for index, file in enumerate(files):
if isdir('/'.join([path, file])):
only_files = False
else:
files[index] = None
if only_files:
return
directories = [d for d in files if d is not None]
latest_version = check_if_versions(directories)
if latest_version is None:
for directory in directories:
check_and_clean('/'.join([path, directory]))
elif len(directories) == 1:
return
else:
print('Mise à jour ' + path.split(Constants.m2_path)[1])
for directory in directories:
if directory == latest_version:
continue
print(directory + ' (A une version plus récente : ' + latest_version + ')')
if not dry_run:
shutil.rmtree('/'.join([path, directory]))
def check_if_versions(directories):
if len(directories) == 0:
return None
latest_version = ''
for directory in directories:
try:
current_version = semver.VersionInfo.parse(directory)
except ValueError:
return None
if latest_version == '':
latest_version = directory
if current_version.compare(latest_version) > 0:
latest_version = directory
return latest_version
if __name__ == '__main__':
check_and_clean(Constants.m2_path)
Constants.py
(modifier pour pointer vers votre propre référentiel Maven local) :
# Chemins
m2_path = '/home/jb/.m2/repository/'
Assurez-vous d'avoir Python 3.6+ installé et que le package semver a été installé dans votre environnement global ou venv
(utilisez pip install semver
s'il est manquant).
Exécutez le script avec python repo-cleaner.py
.
Il recherche récursivement dans le référentiel Maven local que vous avez configuré (normalement ~/.m2/repository
) et s'il trouve un catalogue où résident des versions différentes, il supprime toutes sauf la plus récente.
Disons que vous avez l'arborescence suivante quelque part dans votre référentiel Maven local :
.
└── antlr
├── 2.7.2
│ ├── antlr-2.7.2.jar
│ ├── antlr-2.7.2.jar.sha1
│ ├── antlr-2.7.2.pom
│ ├── antlr-2.7.2.pom.sha1
│ └── _remote.repositories
└── 2.7.7
├── antlr-2.7.7.jar
├── antlr-2.7.7.jar.sha1
├── antlr-2.7.7.pom
├── antlr-2.7.7.pom.sha1
└── _remote.repositories
Ensuite, le script supprime la version 2.7.2 de antlr
et ce qui reste est :
.
└── antlr
└── 2.7.7
├── antlr-2.7.7.jar
├── antlr-2.7.7.jar.sha1
├── antlr-2.7.7.pom
├── antlr-2.7.7.pom.sha1
└── _remote.repositories
Toutes les anciennes versions, même celles que vous utilisez activement, seront supprimées. Elles peuvent facilement être restaurées avec Maven (ou d'autres outils de gestion des dépendances).
Vous pouvez obtenir un journal de ce qui va être supprimé sans le supprimer réellement en définissant dry_run = True
. La sortie ressemblera à ceci :
mise à jour /org/projectlombok/lombok
1.18.2 (version plus récente : 1.18.6)
1.16.20 (version plus récente : 1.18.6)
Cela signifie que les versions 1.16.20 et 1.18.2 de lombok seront supprimées et 1.18.6 sera laissée intacte.
La dernière version des fichiers ci-dessus peut être trouvée sur mon github.
- Réponses précédentes
- Plus de réponses