2013-10-11 3 views
37

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

+2

Просто удалите '.m2repository' папку. Он будет создан автоматически после компиляции проекта. – user2339071

+0

или купить большой жесткий диск и не заботиться :) – smajlo

+2

Может быть, есть более элегантное решение, чем ждать компиляции и потратить деньги на жесткий диск? :) ** Но серьезно **, я работаю удаленно на виртуальной машине, поэтому дисковое пространство (маленькое) и время компиляции (длинные) значительны. Вот почему я не могу просто сменить HDD или процессор. Поэтому мне нужно использовать его более эффективно. – Cherry

ответ

18

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

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

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

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

+0

«поэтому определение того, какой из них не используется, невозможно». Мне не нужно это определение Мне нужно оставить только новые версии. – Cherry

+2

Затем удалите папку .m2, а затем убедитесь, что все проекты имеют только новые версии записи jar в pom .xml. Перестройте проект. Папка .m2 останется с только последней версией. – gyan

+0

'delete .m2' приводит к удалению всех зависимостей и загрузке новых из репозитория, который является экстремально медленным. – Cherry

4

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

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

Эта команда вызова должна работать: МВН зависимость: продувка локального репозитария -DreResolve = ложь

+0

Хорошо :) Но эта очистка зависит только от текущего проекта, а не от всего репозитория. – Cherry

+2

Это правда! Чтобы очистить весь репозиторий, я пошел вручную и удалял каталоги из ./m2/repository, как было прокомментировано до или в новых версиях Nexus (после 2.6.4-02.) Они предоставляют задачу Scheduled [link] (http: // blog.sonatype.com/2009/09/nexus-scheduled-tasks/#.VGUD52NGWdA) Удалите выпуски из возможностей репозитория из коробки. Также может быть полезно –

20

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

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

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

Добавить «эхо» перед rm, чтобы сделать «сухой пробег».

+6

В OSX (может также работать и с инструментами GNU) 'find ~/.m2/repository/-atime +30 -iname '* .pom' -print0 | при чтении -d '' -r pom; do echo rm -rf "$ (dirname $ pom)"; done' где 'atime' находится в днях (по сравнению с' amin' в минутах) – Brice

+0

Я использую 'find ~/.m2 -atime + 1w -iname '* .pom' | при чтении pom; do parent = $ (dirname "$ pom"); rm -rf "$ parent"; done ", который работает для меня на OSX. Должен работать отлично и в других unixes :) – Meeh

1

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

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

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

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

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

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

+1

fwiw, это сработало для меня на моей установке cygwin. – catholicon

+0

Рад это услышать. Полагаю, я должен пойти на проблему превращения его в драгоценный камень. –

+0

кажется, я говорил слишком рано. Я не знаю шаблона, но некоторые из банок были удалены, хотя я знаю, что использовал их недавно. Но в то же время некоторые остались. – catholicon

1

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

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

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

+1

Если у вас нет устаревших банок, добавленных вручную в репозиторий, или зависимости больше не доступны в Интернете. Этот ответ немного опасен ... по крайней мере, поддержите сначала! –

-1

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

Например: Проблема: ... m2 \ репозиторий \ ком \ fasterxml \ джексон \ ядро ​​\ ДЖЕКСОНА-ядро \ 2.5.0 \ ДЖЕКСОНА-ядро-2.5.0.jar не на его сборки путь проекта

Решение: Перейдите к .m2 reposistory и удалить папку fasterxml

4
  1. Скачать все фактические зависимости от ваших проектов

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

    mv ~/.m2 ~/saved-m2 
    
  3. Переименовать все файлы Maven-метаданные central.xml * из сохраненного в хранилище Maven-metadata.xml *

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

    <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 с минимальными затратами необходимых артефактов , Удалите локальное зеркало из файла конфигурации и из файловой системы.

+0

Пробовал это, все еще получил: «Плагин не найден для префикса« зависимостей »в текущем проекте и в группах плагинов [org.apache.maven.plugins, org.codehaus.mojo], доступных из репозиториев [local (/ home/user/.m2/repository), mycentral (файл:/home/user/saved-m2 /)] " –

0

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

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

Смежные вопросы