it-swarm.com.ru

Как очистить старые зависимости от репозиториев Maven?

У меня слишком много файлов в папке .m2, где maven хранит загруженные зависимости. Есть ли способ очистить все старые зависимости? Например, если есть зависимость с 3 различными версиями: 1, 2 и 3, после очистки должна быть только 3-я. Как я могу сделать это для всех зависимостей в папке .m2?

46
Cherry

Если вы работаете в Unix, вы можете использовать время доступа к файлам там. Просто включите время доступа для вашей файловой системы, затем запустите чистую сборку всех ваших проектов, для которых вы хотите сохранить зависимости, и затем сделайте что-то вроде этого (НЕПРОВЕРЕНО!):

find ~/.m2 -amin +5 -iname '*.pom' | while read pom; do parent=`dirname "$pom"`; rm -Rf "$parent"; done

При этом будут найдены все файлы * .pom, к которым последний раз обращались более 5 минут назад (при условии, что вы начали строить не более 5 минут назад), и будут удалены их каталоги.

Добавьте «echo» перед rm, чтобы выполнить «всухую».

26
Florian

Краткий ответ - Удалена папка .m2 в {user.home}. Например. в Windows 10 домашним пользователем является C:\Users\user1. Перестройте свой проект, используя mvn clean package. Останутся только те зависимости, которые требуются проектам.

Длинный ответ -. m2 папка похожа на обычную папку, а содержимое папки создается из разных проектов. Я думаю, что нет способа автоматически выяснить, какая библиотека "старая". На самом деле старое - это смутное Слово. Причин использования предыдущей версии библиотеки в проекте может быть очень много, поэтому определить, какая из них не используется, невозможно.

Все, что вы можете сделать, это удалить папку .m2 и пересобрать все ваши проекты, после чего папка автоматически соберется со всей необходимой библиотекой.

Если вас беспокоит только конкретная версия библиотеки, которая будет использоваться во всех проектах; важно, чтобы pom проекта также обновлялся до последней версии. То есть, если разные POM ссылаются на разные версии библиотеки, все они будут загружены в .m2.

24
Gyanendra Dwivedi

Имея POM-файл для проекта maven, вы можете удалить все его зависимости в локальном репозитории (по умолчанию ~/.m2/respository), используя плагин зависимостей Apache Maven . Он включает в себя зависимость: purge-local -режим репозитория, который удаляет зависимости проекта из локального репозитория и дополнительно разрешает их повторное разрешение.

Чтобы очистить локальные зависимости, вам просто нужно использовать необязательный параметр reResolve и установить его в false, поскольку по умолчанию он имеет значение true.

Этот вызов командной строки должен работать: Зависимость mvn: purge-local-repository -DreResolve = false

5
Juanjo Marron
  1. Загрузите все актуальные зависимости ваших проектов

    find your-projects-dir -name pom.xml -exec mvn -f '{}' dependency:resolve
    
  2. Переместите ваш локальный репозиторий Maven во временную папку

    mv ~/.m2 ~/saved-m2
    
  3. Переименуйте все файлы maven-metadata-central.xml * из сохраненного репозитория в maven-metadata.xml *

    find . -type f -name "maven-metadata-central.xml*" -exec rename -v -- 's/-central//' '{}' \;
    
  4. Чтобы настроить измененную копию локального репозитория в качестве зеркала, создайте каталог ~/.m2 и файл ~/.m2/settings.xml со следующим содержимым (заменивuserвашим именем пользователя) :

    <settings>
     <mirrors>
      <mirror>
       <id>mycentral</id>
       <name>My Central</name>
       <url>file:/home/user/saved-m2/</url>
       <mirrorOf>central</mirrorOf>
      </mirror>
     </mirrors>
    </settings>
    
  5. Разрешите зависимости ваших проектов снова:

    find your-projects-dir -name pom.xml -exec mvn -f '{}' dependency:resolve
    
  6. Теперь у вас есть локальный репозиторий Maven с минимальным количеством необходимых артефактов. Удалите локальное зеркало из файла конфигурации и из файловой системы.

4
Sergey B.

Я также хотел удалить старые зависимости из своего репозитория Maven. Я думал о том, чтобы просто запустить ответ Флориана, но я хотел что-то, что я мог бы запускать снова и снова, не вспоминая длинный фрагмент linux, и я хотел что-то с небольшой настраиваемостью - больше программы, меньше цепочки команд unix Таким образом, я взял базовую идею и превратил ее в (относительно небольшую) Ruby-программу, которая удаляет старые зависимости в зависимости от времени их последнего доступа.

Он не удаляет «старые версии», но, поскольку у вас могут быть два разных активных проекта с двумя разными версиями зависимости, это не сделало бы того, что я хотел в любом случае. Вместо этого, как и ответ Флориана, он удаляет зависимости, к которым недавно не обращались.

Если вы хотите попробовать это, вы можете:

  1. Посетите GitHub репозиторий
  2. Клонируйте репозиторий или загрузите исходный код
  3. При желании проверьте код, чтобы убедиться, что он не является вредоносным
  4. Запустите bin/mvnclean

Существуют варианты переопределения хранилища Maven по умолчанию, игнорирования файлов, установки пороговой даты, но вы можете прочитать их в README на GitHub.

Вероятно, в какой-то момент я упакую его как гем Ruby после того, как немного поработаю над ним, что упростит задачу (gem install mvnclean; mvnclean), если у вас уже установлен и работает Ruby.

1
Geoffrey Wiseman

Просто очистите каждый контент в папке .m2 -> repository. Когда вы создаете проект, все зависимости загружаются здесь.

В вашем случае, возможно, ваш проект ранее использовал старую версию любой зависимости, а теперь версия обновляется. Так что лучше очистите папку .m2 и постройте свой проект с помощью mvn clean install.

Теперь зависимости с модулями последней версии будут загружены в эту папку.

1
Amandeep Singh Bhatia

Вам необходимо скопировать зависимость, которая вам нужна для проекта . Имея их в руках, очистите все теги <dependency>, встроенные в тег <dependencies> , Из файла POM.XML в вашем проекте. 

После сохранения файла вы не увидите Maven Dependencies в своей Libraries. Затем вставьте те <dependency>, которые вы скопировали ранее.

Maven автоматически загрузит необходимые файлы jar, вы можете увидеть это и в Сгенерированных Maven Dependencies Libraries после сохранения файла.

Благодарю.

0
Shubhasish Bhunia

Я придумал утилиту и разместил на GitHub для очистки старых версий библиотек в локальном репозитории Maven. Утилита при выполнении по умолчанию удаляет все старые версии артефактов, оставляя только самые последние. При желании он может удалить все снимки, источники, javadocs, а также группы или артефакты могут быть принудительно/исключены в этом процессе. Эта кроссплатформенная также поддерживает удаление на основе даты на основе последних дат доступа/загрузки.

https://github.com/techpavan/mvn-repo-cleaner

0
Pavan Kumar