Jak wyczyścić pamięć podręczną Apache Maven?


212

Ostatnio wydaje się, że Apache Maven ma problemy z buforowaniem. Wykonywanie czystych instalacji w naszych projektach przy użyciu systemu Windows Vista lub Windows 7 czasami wytwarza artefakty z tymi samymi danymi co poprzednia kompilacja, nawet jeśli pliki nowszych artefaktów powinny zostać zaktualizowane.

Czy jest jakiś sposób, aby wyczyścić tę pamięć podręczną, aby zmusić maven, aby zawsze uruchamiał czystą wersję lokalnego artefaktu, który powinien zostać zbudowany?

W szczególności mamy problemy z budowaniem aplikacji internetowej za pomocą wtyczki wojennej. Wersja Maven to 3.0.3. Wersja wtyczki wojennej to 2.1.1.


2
Czy próbowałeś -Uflagi, która aktualizuje artefakty?
Amir Raminfar,

2
Czy możesz podać więcej szczegółów? Czy osoby pozostające na utrzymaniu nie są aktualizowane podczas wojny? Jeśli tak, to czy osoby na utrzymaniu mają wersje SNAPSHOT?
Raghuram

Czy to projekt wielomodułowy? Czy sprawdziłeś numer wersji zależnych modułów? Czy możesz się rozmnażać? mvn clean installumieścić nowe artefakty w lokalnym repozytorium?
palacsint

@ MetroidFan2002 Czy możemy tutaj podać wyraźną odpowiedź? Lub możesz napisać rozwiązanie, jeśli znalazłeś je samodzielnie.
Naman

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

Odpowiedzi:


225

Usuń c:\Users\<username>\.m2\repositoryręcznie artefakty (lub pełne repozytorium lokalne) .


4
Próbowałem tego już nie działa. Dziękuję za sugestię.
MetroidFan2002

3
wygląda na to, że nawet po ponownym uruchomieniu, do cholery wielu artefaktów maven ma do nich dostęp: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
Pamiętaj, że lokalizacja folderu może się różnić w twoim systemie - zobacz tę odpowiedź, jak uzyskać ścieżkę do folderu repozytorium maven
jakub.g

9
@ liltitus27 to samo tutaj, po prostu usuwanie ~ / .m2 / repozytorium nie działało, w mvn dependency:purge-local-repositorykońcu działało
qbert65536

tak, to działało dla mnie w 100% - Windows10 w sieci korporacyjnej jako użytkownik niebędący administratorem
Graeme Phillips

176

Aby wyczyścić lokalną pamięć podręczną, spróbuj użyć wtyczki zależności.

  1. mvn dependency:purge-local-repository: Jest to próba usunięcia plików lokalnego repozytorium, ale zawsze idzie i wypełnia lokalne repozytorium po usunięciu rzeczy.
  2. mvn dependency:purge-local-repository -DreResolve=false: Pozwala to uniknąć ponownego rozwiązywania zależności, ale wydaje się, że czasami przechodzi do sieci.
  3. mvn dependency:purge-local-repository -DactTransitively=false -DreResolve=false: Dodał to Paweł Prażak i wydaje się, że działa dobrze. Użyłbym trzeciego, jeśli chcesz opróżnić lokalne repo, i pierwszego, jeśli chcesz po prostu wyrzucić lokalne repo i ponownie uzyskać zależności.

4
jaka jest różnica między nimi?
Pieter De Bie,

13
Pierwszą jest próba usunięcia plików lokalnego repozytorium, ale zawsze idzie i wypełnia lokalne repozytorium po usunięciu rzeczy. Drugi pozwala uniknąć ponownego rozwiązywania zależności, ale wydaje się, że czasami przechodzi do sieci. Trzeci dodał Paweł Prażak i wydaje się, że działa dobrze. Użyłbym trzeciego, jeśli chcesz opróżnić lokalne repo, i pierwszego, jeśli chcesz po prostu wyrzucić lokalne repo i ponownie uzyskać zależności.
Brian C.

Z wiersza poleceń w systemie Linux. Musisz zainstalować mvn. maven.apache.org/install.html
Brian C.

Dodam, że możesz celować w określone grupy / artefakty za pomocą dodatkowego parametru. Ta odpowiedź jest zdecydowanie tym, czego szukałem (opcja 3). Oto ten dodatkowy parametr ::: zależność mvn: purge-local-repository -DmanualInclude = "myGroupId" -DsnapshotsOnly = true -DactTransitively = false -DreResolve = false
granadaCoder

Wypróbowałem trzecią opcję w celu usunięcia całej zawartości lokalnego repozytorium , ale to nie działa - do tego momentu unikalnym sposobem na osiągnięcie tego celu jest ręczne usunięcie całej zawartości tego katalogu. Mam lokalne repozytorium w innej lokalizacji niż <User_Name>/.m2lokalizacja. Nie jestem pewien, czy to byłby powód.
Manuel Jordan

13

Czy sprawdziłeś / zmieniłeś ustawienia updatePolicy dla swoich repozytoriów w twoim settings.xml.

Ten element określa częstotliwość prób aktualizacji. Maven porówna znacznik czasowy lokalnej POM (przechowywany w pliku maven-metadanych repozytorium) ze zdalnym. Dostępne są następujące opcje: zawsze, codziennie (domyślnie), interwał: X (gdzie X jest liczbą całkowitą w minutach) lub nigdy.

Spróbuj to ustawić always.


1
Możliwa pomoc dla tych, którzy zajmują się tym ... Nie mam <updatePolicy>w moim pliku pom.xml, ale jest<snapshotPolicy>
Al Lelopath,

updatePolicy jest ustawiony na zawsze wszędzie w moich ustawieniach. xml.
MasterJoe2

11

Zrobiłbym następujące:

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

Flagi informują maven, aby nie próbował rozwiązywać zależności ani nie uderzał w sieć. Usuń to, co widzisz lokalnie.

Na wszelki wypadek ignoruj ​​błędy ( --fail-at-end) do samego końca. Czasami jest to przydatne w przypadku projektów, które mają nieco pomieszany zestaw zależności lub polegają na nieco pomieszanym wewnętrznym repozytorium (zdarza się.)


1
Czy nie wystarczy po prostu usunąć lokalny folder pamięci podręcznej dla tego rodzaju czyszczenia?

1
Możesz, jeśli znasz każdą zależność przechodnią. Ale potem staje się nudne (lub moglibyśmy po prostu usunąć całą pamięć podręczną, ale zmusi to maven do ponownego pobrania wszystkiego dla rzeczy niezwiązanych z danym artefaktem). Wszystko zależy od specyfiki sytuacji.
luis.espinal

6

Działa to w Spring Tool Suite v 3.1.0. RELEASE, ale domyślam się, że jest on również dostępny w Eclipse.

Po ręcznym usunięciu artefaktów (jak podano powyżej w palacsint) w /username/.m2katalogu, ponownie zindeksuj pliki, wykonując następujące czynności:

Iść do:

  • Windows->Preferences->Maven->User Settings menu.

Kliknij Reindexprzycisk obok Local Repositorypola tekstowego. Kliknij „Zastosuj”, a następnie „OK” i gotowe.


2

Jak zauważyły ​​niektóre odpowiedzi, czasami naprawdę chcesz całkowicie usunąć lokalne repozytorium, na przykład mogą istnieć pewne artefakty, których nie można usunąć, ponieważ pom nie są już przywoływane przez pom.

Jeśli chcesz, aby to usunięcie zostało osadzone w fazie maven, na przykład cleanmożesz użyć maven-clean-plugini uzyskać dostęp do repozytorium poprzez ustawienia, na przykład:

 <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

Użyj, mvn dependency:purge-local-repository -DactTransitively=false -Dskip=truejeśli masz wtyczki maven jako jeden z modułów. W przeciwnym razie Maven spróbuje je ponownie skompilować, ponownie pobierając zależności.


1
Właśnie tego szukałem, ma po prostu literówkę (brakuje kreski do pominięcia): zależność mvn: purge-local-repository -DactTransitively = false -Dskip = true
shoguren

0

Miałem ten sam problem i napisałem, żeby to zrobić.

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

Zrobiłem to jako jedno-liniowy, ponieważ chciałem mieć projekt Jenkins, aby po prostu uruchamiał to w dowolnym momencie, więc nie musiałbym logować się do rzeczy itp. Jeśli pozwolisz sobie na skrypt powłoki, możesz napisać to czystsze:

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

Powinien działać, ale nie przetestowałem całego tego skryptu. (Przetestowałem pierwsze polecenie, ale nie cały skrypt). Takie podejście ma tę wadę, że najpierw uruchamia duże, skomplikowane polecenie. Jest idempotentny, więc możesz to sprawdzić na własne oczy. Usunięcie jest potem jego własnym poleceniem, co pozwala wypróbować wszystko i sprawdzić, czy robi to, co myślisz, ponieważ działa, ponieważ nie powinieneś ufać poleceniom usuwania bez weryfikacji. Jest jednak sprytny z jednego dobrego powodu: jest przenośny. Szanuje twój plik settings.xml. Jeśli uruchomisz to polecenie i powiesz maven, aby używał określonego pliku xml (argument -s lub --settings), to nadal będzie działać. Nie musisz więc bawić się, upewniając się, że wszystko jest takie samo.

Jest trochę władczy, ale to dobry sposób na robienie interesów, IMO.


-3

Jest więc kilka poleceń, których można użyć do czyszczenia

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

pomocne może być również usunięcie folderu repozytorium z .m2.


1
Co powinna zrobić „czysta pamięć podręczna mvn”? Nie wydaje mi się to uznanym poleceniem.
AMTerp,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.