Як очистити кеш Apache Maven?


213

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

Чи є спосіб очистити цей кеш-пам'ять, щоб змусити Maven завжди викликати чисту структуру локального артефакту, який слід побудувати?

Зокрема, у нас виникають проблеми зі створення webapp з плагін війни. Версія Maven - 3.0.3. Версія плагінів війни - 2.1.1.


2
Ви спробували -Uпрапор, який буде оновлювати артефакти?
Амір Рамінфар

2
Чи можете ви надати більше деталей? Чи утриманці не оновлюються на війні? Якщо так, то чи мають утриманці версії SNAPSHOT?
Рагурам

Це багатомодульний проект? Ви перевірили номер версії залежних модулів? Ви могли б відтворити? mvn clean installпомістити нові артефакти до місцевого сховища?
palacsint

@ MetroidFan2002 Чи можемо ми, будь ласка, позначити відповідь тут. Або ви можете написати рішення, якщо знайшли його самостійно.
Наман

1
mvn clean install -Dmaven.repo.local=/alternate/repo/location
Gayan Weerakutti

Відповіді:


225

Видаліть артефакти (або повне місцеве репо) від c:\Users\<username>\.m2\repositoryруки.


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 repo
jakub.g

9
@ liltitus27 тут же, просто витирання ~ / .m2 / сховище не спрацювало, mvn dependency:purge-local-repositoryнарешті запрацювало
qbert65536

так, це працювало на мене 100% - Windows10 у корпоративній мережі як користувач не адміністратор
Graeme Phillips

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: Це додав Павель Пражак і, здається, працює добре. Я б скористався третім, якщо ви хочете, щоб місцеве репо випорожнилося, і першим, якщо ви просто хочете викинути місцеве репо і знову отримати залежності.

4
в чому різниця між ними?
Пітер Де Бі

13
Перший - це спроба видалити локальні файли репозиторію, але він завжди проходить і заповнює локальне сховище після того, як речі були видалені. Другий дозволяє уникнути повторного усунення залежностей, але, здається, часом все-таки переходить до мережі. Третє додав Павел Пражак і, здається, працює добре. Я б скористався третім, якщо ви хочете, щоб місцеве репо випорожнилося, і першим, якщо ви просто хочете викинути місцеве репо і знову отримати залежності.
Брайан К.

З командного рядка в системі Linux. Вам потрібно буде встановити mvn. maven.apache.org/install.html
Брайан К.

Додам, що ви можете націлити конкретні групи / артефакти з додатковим параметром. Ця відповідь, безумовно, шукала (варіант 3). Ось цей додатковий параметр ::: mvn залежність: purge-local-repository -DmanualInclude = "myGroupId" -DsnapshotsOnly = true -DactTransitively = false -DreResolve = false
granadaCoder

Я спробував 3-й варіант з метою видалити весь вміст у локальному сховищі , але він не працює - до цього моменту єдиним способом досягнення цієї мети є видалення вручну всього вмісту цього каталогу. Я маю локальне сховище в іншому місці, ніж <User_Name>/.m2місцеположення. Не впевнений, чи це буде причиною.
Мануель Йордан

13

Ви перевірили / змінили налаштування updatePolicy для своїх сховищ у вашому settings.xml.

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

Спробуйте встановити це always.


1
Можлива допомога для вирішення цього питання ... У мене немає <updatePolicy>свого pom.xml, але є<snapshotPolicy>
Al Lelopath

updatePolicy встановлюється завжди скрізь у моїх настройках.xml.
MasterJoe2

11

Я б зробив наступне:

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

Прапори говорять Maven не намагатися вирішувати залежності та не потрапляти в мережу. Видаліть те, що ви бачите локально.

І на користь, ігноруйте помилки ( --fail-at-end) до самого кінця. Іноді це корисно для проектів, які мають дещо заплутаний набір залежностей або покладаються на дещо заплутане внутрішнє сховище (це буває.)


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текстового поля. Натисніть «Застосувати», потім «ОК», і ви закінчите.


2

Як зазначалося в деяких відповідях, іноді вам дуже хочеться повністю видалити локальний сховище, наприклад, можуть бути деякі артефакти, які неможливо очистити, оскільки пам’ять більше не посилається на них.

Якщо ви хочете, щоб це видалення було вбудовано в основну фазу, як, наприклад, 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 спробує їх перекомпілювати, тим самим завантажуючи залежності знову.


1
Це насправді те, що я шукав, він просто має помилку друку (пропущено тире для пропуску): mvn залежність: 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]')/*

Я зробив це як однолінійний, тому що хотів створити проект Дженкінса, щоб просто запускати це, коли мені потрібно, тому мені не доведеться входити в систему тощо. Якщо ви дозволяєте собі сценарій оболонки, ви можете написати це очищення:

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


1
Що потрібно робити "mvn clean cache"? Здається, це не є визнаною командою для мене.
AMTerp
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.