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

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

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

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

11 ответов

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

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

  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 и, кажется, работает хорошо. Я бы использовал третий, если вы хотите очистить локальное репо, и первый, если вы просто хотите выбросить локальное репо и снова получить зависимости.

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

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

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

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

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

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

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

Я удивлен, что никто еще не упомянул об этом, но

      mvn clean install -U

The -Uфлаг указывает Maven на получение свежих копий всех зависимостей без использования локального кеша.

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

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

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

Зайдите в Windows-> Настройки->Maven-> Настройки пользователя.

Нажмите кнопку "Переиндексировать" рядом с текстовым полем "Локальный репозиторий". Нажмите "Применить", затем "ОК", и все готово.

Как указывалось в некоторых ответах, иногда вы действительно хотите полностью удалить локальный репозиторий, например, могут быть некоторые артефакты, которые невозможно очистить, поскольку на них больше не ссылается 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>

Я согласен на использованиеmvn clean install -Uкак первый вариант. Вам не обязательно очищать весь локальный репозиторий.

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

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), это все равно будет работать. Так что вам не придется возиться с тем, чтобы везде все было одинаково.

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

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

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

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

Другие вопросы по тегам