Bagaimana Anda menghapus cache Apache Maven?

213

Baru-baru ini, Apache Maven tampaknya mengalami masalah caching. Melakukan instalasi bersih pada proyek kami menggunakan Windows Vista atau Windows 7 kadang-kadang menghasilkan artefak dengan data yang sama dengan build sebelumnya walaupun file artifact yang lebih baru seharusnya diperbarui.

Apakah ada cara untuk menghapus cache ini untuk memaksa pakar untuk selalu memicu pembangunan artifak lokal yang harus dibangun?

Secara khusus, kami mengalami masalah dalam membangun webapp dengan plugin perang. Versi Maven adalah 3.0.3. Versi plugin perang adalah 2.1.1.

MetroidFan2002
sumber
2
Sudahkah Anda mencoba -Ubendera yang akan memperbarui artefak?
Amir Raminfar
2
Bisakah Anda memberikan lebih banyak detail? Apakah tanggungan tidak diperbarui dalam perang? Jika demikian, apakah tanggungan memiliki versi SNAPSHOT?
Raghuram
Apakah ini proyek multimodule? Sudahkah Anda memeriksa nomor versi dari modul dependen? Bisakah kamu mereproduksi? mvn clean installmenempatkan artefak baru ke repositori lokal?
palacsint
@ MetroidFan2002 Bisakah kita memiliki jawaban yang ditandai di sini. Atau Anda dapat menulis solusi jika Anda menemukannya sendiri.
Naman
1
mvn clean install -Dmaven.repo.local=/alternate/repo/location
Gayan Weerakutti

Jawaban:

226

Hapus artefak (atau repo lokal lengkap) dari c:\Users\<username>\.m2\repositorydengan tangan.

palacsint
sumber
4
Sudah mencoba itu, tidak berhasil. Terima kasih atas sarannya.
MetroidFan2002
3
sepertinya, bahkan setelah restart, banyak artefak pakar menangani mereka: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
Perhatikan bahwa lokasi folder mungkin berbeda pada sistem Anda - lihat jawaban ini untuk cara mendapatkan jalur folder repo maven
jakub.g
9
@ liltitus27 sama di sini, hanya memusnahkan ~ / .m2 / repositori tidak bekerja, mvn dependency:purge-local-repositoryakhirnya berhasil
qbert65536
ya ini bekerja untuk saya 100% - Windows10 di jaringan perusahaan sebagai pengguna bukan admin
Graeme Phillips
176

Untuk membersihkan cache lokal coba gunakan plug-in dependensi.

  1. mvn dependency:purge-local-repository: Ini adalah upaya untuk menghapus file repositori lokal tetapi selalu berjalan dan mengisi repositori lokal setelah semuanya dihapus.
  2. mvn dependency:purge-local-repository -DreResolve=false: Ini menghindari penyelesaian kembali dependensi tetapi tampaknya masih pergi ke jaringan di kali.
  3. mvn dependency:purge-local-repository -DactTransitively=false -DreResolve=false: Ini ditambahkan oleh Paweł Prażak dan tampaknya bekerja dengan baik. Saya akan menggunakan yang ketiga jika Anda ingin repo lokal dikosongkan, dan yang pertama jika Anda hanya ingin membuang repo lokal dan mendapatkan dependensi lagi.
Brian C.
sumber
4
apa perbedaan di antara mereka?
Pieter De Bie
13
Yang pertama adalah upaya untuk menghapus file repositori lokal tetapi selalu berjalan dan mengisi repositori lokal setelah semuanya dihapus. Yang kedua menghindari penyelesaian kembali dependensi tetapi tampaknya masih pergi ke jaringan di kali. Ketiga ditambahkan oleh Paweł Prażak dan tampaknya bekerja dengan baik. Saya akan menggunakan yang ketiga jika Anda ingin repo lokal dikosongkan, dan yang pertama jika Anda hanya ingin membuang repo lokal dan mendapatkan dependensi lagi.
Brian C.
Dari baris perintah pada sistem linux. Anda harus menginstal mvn. maven.apache.org/install.html
Brian C.
Saya akan menambahkan bahwa Anda dapat menargetkan grup / artefak tertentu dengan parameter tambahan. Jawaban ini jelas apa yang saya cari (opsi 3). Berikut adalah parameter tambahan ::: mvn dependensi: purge-local-repository -DmanualInclude = "myGroupId" -DsnapshotsOnly = true -DactTransitive = false -DreResolve = false
granadaCoder
Saya mencoba opsi ke-3 dengan tujuan untuk menghapus semua konten dalam repositori lokal , tetapi tidak berfungsi - sampai saat ini cara unik untuk mencapai tujuan ini adalah menghapus secara manual semua isi direktori itu. Saya memiliki repositori lokal di lokasi yang berbeda dari <User_Name>/.m2lokasi. Tidak yakin apakah itu alasannya.
Manuel Jordan
13

Sudahkah Anda memeriksa / mengubah pengaturan updatePolicy untuk repositori Anda di settings.xml.

Elemen ini menentukan seberapa sering pembaruan harus dilakukan. Maven akan membandingkan timestamp POM lokal (disimpan dalam file metadata maven repositori) dengan remote. Pilihannya adalah: selalu, setiap hari (default), interval: X (di mana X adalah bilangan bulat dalam menit) atau tidak pernah.

Cobalah untuk mengaturnya always.

FrVaBe
sumber
1
Kemungkinan bantuan untuk anway berurusan dengan ini ... Saya tidak ada <updatePolicy>di pom.xml saya, tetapi ada<snapshotPolicy>
Al Lelopath
updatePolicy diatur ke selalu di mana saja di settings.xml saya.
MasterJoe2
11

Saya akan melakukan hal berikut:

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

Bendera memberi tahu pakar untuk tidak mencoba menyelesaikan dependensi atau menekan jaringan. Hapus apa yang Anda lihat secara lokal.

Dan untuk ukuran yang baik, abaikan kesalahan ( --fail-at-end) sampai akhir. Ini kadang-kadang berguna untuk proyek yang memiliki set dependensi yang agak kacau atau bergantung pada repositori internal yang agak kacau (itu terjadi.)

luis.espinal
sumber
1
Apakah tidak cukup hanya menghapus folder cache lokal untuk pembersihan yang agak ini?
1
Anda bisa jika Anda tahu setiap ketergantungan transitif tunggal. Tapi kemudian menjadi membosankan (atau kita bisa menghapus seluruh cache, tapi itu akan memaksa pakar untuk mengunduh semuanya lagi untuk hal-hal yang tidak terkait dengan artefak yang dimaksud.) Semuanya tergantung pada spesifikasi situasi.
luis.espinal
6

Ini berfungsi pada Spring Tool Suite v 3.1.0.RELEASE, tapi saya rasa ini juga tersedia di Eclipse.

Setelah menghapus artefak dengan tangan (seperti yang dinyatakan oleh palacsint di atas) di /username/.m2direktori, indeks ulang file dengan melakukan hal berikut:

Pergi ke:

  • Windows->Preferences->Maven->User Settings Tidak bisa.

Klik Reindextombol di sebelah Local Repositorykotak teks. Klik "Terapkan" lalu "OK" dan Anda selesai.

Felby
sumber
2

Seperti yang ditunjukkan oleh beberapa jawaban, kadang-kadang Anda benar-benar ingin menghapus repositori lokal seluruhnya, misalnya, mungkin ada beberapa artefak yang tidak dapat dihapus karena tidak lagi dirujuk oleh pom.

Jika Anda ingin memiliki penghapusan ini tertanam dalam fase pakar, seperti misalnya cleanAnda dapat menggunakan maven-clean-plugindan mengakses repositori melalui pengaturan, misalnya:

 <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>
Maximilian Schulz
sumber
2

Gunakan mvn dependency:purge-local-repository -DactTransitively=false -Dskip=truejika Anda memiliki plugin pakar sebagai salah satu modul. Kalau tidak, Maven akan mencoba mengkompilasi ulang, sehingga mengunduh dependensi lagi.

PedoDorf
sumber
1
Ini sebenarnya yang saya cari, hanya memiliki kesalahan ketik (melewatkan tanda hubung untuk lompatan): mvn dependensi: purge-local-repository -DactTransitive = false -Dskip = true
shoguren
0

Saya memiliki masalah yang sama, dan saya menulis satu-baris di shell untuk melakukannya.

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

Saya melakukannya sebagai satu-liner karena saya ingin memiliki proyek Jenkins untuk menjalankan ini kapan saja saya butuhkan, jadi saya tidak perlu masuk ke hal-hal, dll. Jika Anda membiarkan sendiri shell-script untuk itu, Anda bisa menulisnya lebih bersih:

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

Seharusnya berhasil, tetapi saya belum menguji semua skrip itu. (Saya sudah menguji perintah pertama, tetapi tidak seluruh skrip.) Pendekatan ini memiliki kelemahan menjalankan perintah rumit yang besar terlebih dahulu. Itu idempoten, jadi Anda bisa mengujinya sendiri. Penghapusan adalah perintahnya sendiri setelah itu, dan ini memungkinkan Anda untuk mencoba semuanya dan memeriksa apakah ia melakukan apa yang Anda pikirkan, karena Anda tidak boleh mempercayai perintah penghapusan tanpa verifikasi. Namun, itu pintar karena satu alasan: itu portabel. Ini menghormati file settings.xml Anda. Jika Anda menjalankan perintah ini, dan beri tahu maven untuk menggunakan file xml tertentu (argumen -s atau --settings), ini masih akan berfungsi. Jadi Anda tidak perlu bermain-main untuk memastikan semuanya sama di mana-mana.

Agak sulit, tapi ini cara yang layak untuk berbisnis, IMO.

Haakon Løtveit
sumber
-3

Jadi ada beberapa perintah yang bisa Anda gunakan untuk membersihkan

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

juga menghapus folder repositori dari .m2 dapat membantu.

Codiee
sumber
1
Apa yang harus dilakukan "mvn clean cache"? Tampaknya itu bukan perintah yang diakui bagi saya.
AMTerp