Как очистить кэш Apache Maven?

213

В последнее время у Apache Maven возникают проблемы с кэшированием. Выполнение чистой установки в наших проектах с использованием Windows Vista или Windows 7 иногда приводит к появлению артефактов с теми же данными, что и в предыдущей сборке, даже если файлы нового артефакта должны были быть обновлены.

Есть ли способ очистить этот кеш, чтобы maven всегда вызывал чистую сборку локального артефакта, который должен быть построен?

В частности, у нас возникают проблемы при создании веб-приложения с помощью плагина war. Maven версия 3.0.3. Версия плагина War 2.1.1.

MetroidFan2002
источник
2
Вы пробовали -Uфлаг, который обновит артефакты?
Амир Раминфар
2
Вы можете дать более подробную информацию? Разве иждивенцы не обновляются на войне? Если да, есть ли у иждивенцев версии SNAPSHOT?
Рагурам
Это многомодульный проект? Вы проверили номер версии зависимых модулей? Не могли бы вы воспроизвести? mvn clean installположить новые артефакты в локальный репозиторий?
Palacsint
@ MetroidFan2002 Можем ли мы иметь помеченный ответ здесь. Или вы можете написать решение, если вы нашли его самостоятельно.
Наман
1
mvn clean install -Dmaven.repo.local=/alternate/repo/location
Гаян Виракутти

Ответы:

226

Удалите артефакты (или полное локальное репо) c:\Users\<username>\.m2\repositoryвручную.

palacsint
источник
4
Пробовал уже, не сработало. Спасибо за предложение, хотя.
MetroidFan2002
3
Кажется, даже после перезапуска, чертовски много артефактов maven имеют ручки для них: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
Обратите внимание, что местоположение папки может отличаться в вашей системе - см. Этот ответ, чтобы узнать, как получить путь к папке
репозитория Maven
9
@ liltitus27 то же самое здесь, просто уничтожение ~ / .m2 / хранилище не сработало, mvn dependency:purge-local-repositoryнаконец-то сработало
qbert65536
да, это сработало для меня на 100% - Windows10 в корпоративной сети как пользователь, не являющийся администратором
Грэм Филлипс
176

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

  1. mvn dependency:purge-local-repository: Это попытка удалить файлы локального репозитория, но она всегда идет и заполняет локальный репозиторий после того, как что-то было удалено.
  2. mvn dependency:purge-local-repository -DreResolve=falseЭто позволяет избежать повторного разрешения зависимостей, но, похоже, время от времени отправляется в сеть.
  3. mvn dependency:purge-local-repository -DactTransitively=false -DreResolve=false: Это было добавлено Павлом Prażak и, кажется, работает хорошо. Я бы использовал третий, если вы хотите очистить локальное репо, и первый, если вы просто хотите выбросить локальное репо и снова получить зависимости.
Брайан С.
источник
4
какая разница между ними?
Питер Де Би
13
Первый - это попытка удалить файлы локального репозитория, но он всегда идет и заполняет локальный репозиторий после того, как что-то было удалено. Второе избегает повторного разрешения зависимостей, но, похоже, время от времени отправляется в сеть. Третий был добавлен Павлом Prażak и, кажется, работает хорошо. Я бы использовал третий, если вы хотите очистить локальное репо, и первый, если вы просто хотите выбросить локальное репо и снова получить зависимости.
Брайан С.
Из командной строки в системе Linux. Вам нужно будет установить mvn. maven.apache.org/install.html
Брайан С.
Я добавлю, что вы можете нацеливать определенные группы / артефакты с помощью дополнительного параметра. Этот ответ определенно то, что я искал (вариант 3). Вот этот дополнительный параметр ::: зависимость mvn: purge-local-repository -DmanualInclude = "myGroupId" -DsnapshotsOnly = true -DactTransitively = false -DreResolve = false
granadaCoder
Я попробовал третий вариант с целью удаления всего содержимого в локальном репозитории , но он не работает - до этого момента единственным способом достижения этой цели является удаление вручную всего содержимого этого каталога. У меня есть локальный репозиторий в другом месте, чем <User_Name>/.m2местоположение. Не уверен, что это будет причиной.
Мануэль Джордан
13

Вы проверили / изменили настройки updatePolicy для своих репозиториев в своем settings.xml.

Этот элемент указывает, как часто должны происходить обновления. Maven будет сравнивать временную метку локального POM (хранящуюся в файле метаданных репозитория) с удаленным. Возможны следующие варианты: всегда, ежедневно (по умолчанию), интервал: X (где X - целое число в минутах) или никогда.

Попробуйте установить его на always.

FrVaBe
источник
1
Возможная помощь для того, чтобы справиться с этим ... У меня нет <updatePolicy>в моем pom.xml, но есть<snapshotPolicy>
Эл Лелопат
updatePolicy всегда установлен везде в моем файле settings.xml.
MasterJoe2
11

Я бы сделал следующее:

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

Флаги говорят maven не пытаться разрешать зависимости или попадать в сеть. Удалить то, что вы видите локально.

И для хорошей меры игнорируйте ошибки ( --fail-at-end) до самого конца. Это иногда полезно для проектов, которые имеют несколько испорченный набор зависимостей или полагаются на несколько испорченный внутренний репозиторий (это бывает.)

luis.espinal
источник
1
Разве недостаточно просто удалить папку локального кэша для такой очистки?
1
Вы могли бы, если бы вы знали каждую транзитивную зависимость. Но тогда это становится утомительным (или мы можем просто удалить весь кеш, но это заставит maven снова загрузить все для вещей, не связанных с рассматриваемым артефактом.) Все зависит от специфики ситуации.
Luis.espinal
6

Это работает в Spring Tool Suite v 3.1.0.RELEASE, но я предполагаю, что оно также доступно и в Eclipse.

После удаления артефактов вручную (как указано выше в palacsint) в /username/.m2каталоге выполните повторную индексацию файлов, выполнив следующие действия:

Перейти к:

  • Windows->Preferences->Maven->User Settings меню.

Нажмите Reindexкнопку рядом с Local Repositoryтекстовым полем. Нажмите «Применить», затем «ОК», и все готово.

Felby
источник
2

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

Если вы хотите встроить это удаление в фазу maven, например, cleanвы можете использовать maven-clean-pluginи получить доступ к хранилищу через настройки, например:

 <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>
Максимилиан Шульц
источник
2

Используйте, mvn dependency:purge-local-repository -DactTransitively=false -Dskip=trueесли у вас есть плагины Maven в качестве одного из модулей. В противном случае Maven попытается перекомпилировать их, тем самым снова загрузив зависимости.

PedoDorf
источник
1
На самом деле это то, что я искал, у него просто есть опечатка (отсутствует тире для пропуска): mvn dependency: purge-local-repository -DactTransitively = false -Dskip = true
shoguren
0

У меня была такая же проблема, и я написал для этого однострочную оболочку.

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

Я сделал это как однострочник, потому что хотел, чтобы проект Jenkins просто запускал это всякий раз, когда мне было нужно, чтобы мне не приходилось входить в систему и т. Д. Если вы позволите себе сценарий оболочки для этого, Вы можете написать это чище:

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

Должно работать, но я не проверял весь этот сценарий. (Я протестировал первую команду, но не весь сценарий.) У этого подхода есть недостаток: сначала нужно запускать сложную сложную команду. Это идемпотент, так что вы можете проверить это сами. После этого удаление - это отдельная команда, и это позволяет вам все попробовать и проверить, выполняет ли она то, что, по вашему мнению, делает, потому что вы не должны доверять командам удаления без проверки. Тем не менее, он умный по одной уважительной причине: он портативный. Он уважает ваш файл settings.xml. Если вы запускаете эту команду и говорите maven использовать определенный XML-файл (аргумент -s или --settings), это все равно будет работать. Так что вам не нужно возиться с тем, чтобы убедиться, что все везде одинаково.

Это немного громоздко, но это достойный способ ведения бизнеса, ИМО.

Хаакон Лотвейт
источник
-3

Итак, есть несколько команд, которые вы можете использовать для очистки

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

Также может помочь удаление папки репозитория из .m2.

Codiee
источник
1
Что должен делать «mvn clean cache»? Это не кажется мне признанной командой.
AMTerp