Apache Maven'in önbelleğini nasıl temizlersiniz?


213

Son zamanlarda Apache Maven önbellek sorunları yaşıyor gibi görünüyor. Windows Vista veya Windows 7 kullanarak projelerimize temiz kurulumlar yapmak, bazen yeni yapıların dosyaları güncellenmiş olsa bile, önceki yapı ile aynı verilerle yapay nesneler üretebilir.

Bu önbelleği, maven'i her zaman inşa edilmesi gereken yerel artefaktın temiz bir yapısını tetiklemeye zorlamak için temizlemenin bir yolu var mı?

Özellikle, savaş eklentisiyle bir web uygulaması oluştururken sorun yaşıyoruz. Maven sürümü 3.0.3. Savaş eklentisi sürümü 2.1.1'dir.


2
-UEserleri güncelleyecek bayrağı denediniz mi?
Amir Raminfar

2
Daha fazla ayrıntı verebilir misiniz? Bağımlılar savaşta güncellenmiyor mu? Eğer öyleyse, bağımlıların SNAPSHOT sürümleri var mı?
Raghuram

Çok modlu bir proje mi? Bağımlı modüllerin sürüm numarasını kontrol ettiniz mi? Üreme yapabilir misiniz? mvn clean installyeni eserleri yerel veri havuzuna koyuyor mu?
palacsint

@ MetroidFan2002 Burada belirgin bir cevap alabilir miyiz? Veya kendi başınıza bulduğunuzda bir çözüm yazabilirsiniz.
Naman

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

Yanıtlar:


226

Eserleri (veya tam yerel repo) c:\Users\<username>\.m2\repositoryel ile silin .


4
Zaten denedim, işe yaramadı. Yine de öneri için teşekkürler.
MetroidFan2002

3
Bir yeniden başlatmadan sonra bile, birçok maven eserinin bir 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.
halkı

1
Klasör konumunun sisteminizde değişiklik gösterebileceğini unutmayın - maven repo klasör yolunu nasıl alacağınız için bu cevaba bakınız
jakub.g

9
@ liltitus27 burada aynı, sadece silerek ~ / .m2 / depo işe yaramadı, mvn dependency:purge-local-repositorysonunda çalıştı
qbert65536

evet bu benim için% 100 çalıştı - kullanıcı değil yönetici olarak bir şirket ağında
Graeme Phillips

176

Yerel önbelleği temizlemek için bağımlılık eklentisini kullanmayı deneyin.

  1. mvn dependency:purge-local-repository: Bu, yerel depo dosyalarını silme girişimidir, ancak işler kaldırıldıktan sonra her zaman yerel depoyu doldurur ve doldurur.
  2. mvn dependency:purge-local-repository -DreResolve=false: Bu, bağımlılıkların yeniden çözümlenmesini önler, ancak yine de zaman zaman ağa gider gibi görünüyor.
  3. mvn dependency:purge-local-repository -DactTransitively=false -DreResolve=false: Bu Paweł Prażak tarafından eklendi ve iyi çalışıyor gibi görünüyor. Yerel repo boşaltılmasını istiyorsanız üçüncü ve sadece yerel repo atmak ve bağımlılıkları tekrar almak istiyorsanız ilk kullanırsınız.

4
aralarındaki fark nedir?
Pieter De Bie

13
Birincisi, yerel depo dosyalarını silme girişimidir, ancak işler kaldırıldıktan sonra her zaman yerel depoyu doldurur ve doldurur. İkincisi, bağımlılıkların yeniden çözülmesini önler, ancak yine de zaman zaman ağa gider gibi görünüyor. Üçüncü Paweł Praweak tarafından eklendi ve iyi çalışıyor gibi görünüyor. Yerel repo boşaltılmasını istiyorsanız üçüncü ve sadece yerel repo atmak ve bağımlılıkları tekrar almak istiyorsanız ilk kullanacağım.
Brian C.

Linux sistemindeki komut satırından. MVN yüklemeniz gerekecek. maven.apache.org/install.html
Brian C.

Ek bir parametre ile belirli grupları / yapay nesneleri hedefleyebileceğinizi de ekleyeceğim. Bu cevap kesinlikle aradığım şeydi (seçenek 3). İşte bu ekstra parametre ::: mvn bağımlılığı: purge-local-repository -DmanualInclude = "myGroupId" -DsnapshotsOnly = true -DactTransitively = false -DreResolve = false
granadaCoder

Yerel depodaki tüm içeriği silmek amacıyla 3. seçeneği denedim , ancak çalışmıyor - bu noktaya kadar bu hedefe ulaşmanın benzersiz yolu bu dizinin tüm içeriğini manuel olarak silmektir . Ben yerel depoyu daha farklı bir konumda <User_Name>/.m2konum. Nedeni olup olmadığından emin değilim.
Manuel Jordan

13

Eğer / kontrol değiştirdiniz updatePolicy Gözlerinde farklı bilgi saklama için ayarları settings.xml.

Bu öğe, güncellemelerin ne sıklıkta yapılmaya çalışılacağını belirtir. Maven, yerel POM'un zaman damgasını (bir havuzun maven-meta veri dosyasında saklanan) uzaktan kumanda ile karşılaştırır. Seçenekler şunlardır: her zaman, günlük (varsayılan), aralık: X (burada X, dakika cinsinden bir tamsayıdır) veya asla.

Bunu ayarlamaya çalışın always.


1
Bununla başa çıkmak için olası yardım ... <updatePolicy>Pom.xml'imde yok, ama var<snapshotPolicy>
Al Lelopath

updatePolicy, settings.xml dosyamda her yerde her zaman olarak ayarlanmış.
MasterJoe2

11

Aşağıdakileri yaparım:

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

Bayraklar maven'e bağımlılıkları çözmeye çalışmamasını veya ağa vurmamasını söyler. Yerel olarak gördüğünüzü silin.

Ve iyi bir ölçü için, hataları ( --fail-at-end) sonuna kadar yok sayın . Bu bazen, biraz dağınık bağımlılıklar kümesine sahip olan veya biraz dağınık bir iç depoya dayanan projeler için yararlıdır (olur.)


1
Bu tür bir temizleme için yerel önbellek klasörünü silmek yeterli değil mi?

1
Her bir geçişli bağımlılığı biliyorsanız. Ama sonra sıkıcı hale gelir (veya tüm önbelleği silebiliriz, ancak bu, söz konusu eserle ilgisi olmayan şeyler için her şeyi tekrar indirmeye zorlar.) Her şey durumun özelliklerine bağlıdır.
luis.espinal

6

Bu, Spring Tool Suite v 3.1.0'da çalışır.RELEASE, ancak Eclipse'de de mevcut olduğunu tahmin ediyorum.

/username/.m2Dizindeki eserleri el ile sildikten sonra (yukarıdaki palacsint ile belirtildiği gibi) , aşağıdakileri yaparak dosyaları yeniden endeksleyin:

Şuraya git:

  • Windows->Preferences->Maven->User Settings Menü.

Metin kutusunun Reindexyanındaki düğmeyi tıklayın Local Repository. Önce "Uygula" yı ve ardından "Tamam" ı tıklayın.


2

Bazı cevapların işaret ettiği gibi, bazen yerel depoyu tamamen silmek istersiniz , örneğin, artık pom tarafından referans alınmadığı için temizlenemeyen bazı eserler olabilir.

Bu silme işleminin bir maven aşamasında gömülmesini cleanistiyorsanız, örneğin maven-clean-plugindepoyu kullanarak ayarlar aracılığıyla depoya erişebilir ve örneğin:

 <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=trueModüllerden biri olarak maven eklentileriniz varsa kullanın . Aksi takdirde Maven bunları yeniden derlemeye çalışacak, böylece bağımlılıkları tekrar indirecektir.


1
Bu aslında ne aradığını, sadece bir yazım hatası (atlama için bir çizgi eksik): mvn bağımlılık: purge-local-repository -DactTransitively = false -Dskip = true
shoguren

0

Aynı sorunu yaşadım ve bunu yapmak için bir mermi kabuğu yazdım.

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

Tek katmanlı olarak yaptım, çünkü ihtiyacım olduğunda bunu çalıştırmak için bir Jenkins projesine sahip olmak istedim, bu yüzden bir şeyler için oturum açmak zorunda kalmayacaktım, vb. daha temiz yazabilirsiniz:

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

Çalışmalı, ama tüm bu senaryo test etmedim. (İlk komutu test ettim, ama tüm betiği test etmedim.) Bu yaklaşım ilk önce büyük bir karmaşık komut çalıştırmanın dezavantajına sahiptir. Bu idempotent, bu yüzden kendiniz için test edebilirsiniz. Silme işlemi daha sonra kendi komutudur ve bu, hepsini denemenizi ve ne düşündüğünü yaptığını kontrol etmenizi sağlar, çünkü doğrulama olmadan silme komutlarına güvenmemelisiniz. Ancak, iyi bir nedenden dolayı akıllı: Taşınabilir. Settings.xml dosyanıza saygı duyar. Bu komutu çalıştırıyorsanız ve maven'e belirli bir xml dosyası (-s veya --settings bağımsız değişkeni) kullanmasını söylerseniz, bu yine de işe yarayacaktır. Yani her şeyin aynı yerde olduğundan emin olmak zorunda değilsiniz.

Biraz tuhaf, ama iş yapmanın iyi bir yolu, IMO.


-3

Temizlik için kullanabileceğiniz bazı komutlar var

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

Ayrıca .m2'den depo klasörünü silmek de yardımcı olabilir.


1
"Mvn clean cache" ne yapmalı? Benim için tanınmış bir komut gibi görünmüyor.
AMTerp
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.