Ketika pakar mengatakan "resolusi tidak akan dipasang kembali sampai interval pembaruan MyRepo telah berlalu", di mana interval itu ditentukan?

587

Dengan maven, saya kadang-kadang menemukan artefak yang berasal dari beberapa repo pihak ke-3 yang belum saya buat atau masukkan dalam repositori saya.

Saya akan mendapatkan pesan kesalahan dari klien pakar yang mengatakan bahwa artefak tidak dapat ditemukan:

Gagal menemukan org.jfrog.maven.annomojo: maven-plugin-anno: jar: 1.4.0 dalam di http://myrepo:80/artifactory/repo-cache dalam repositori lokal, resolusi tidak akan diulang kembali sampai interval pembaruan MyRepo telah berlalu atau pembaruan dipaksa -> [ Bantuan 1]

Sekarang, saya mengerti apa artinya ini, dan dengan mudah dapat menjalankan kembali perintah saya -U, dan segala sesuatunya berjalan dengan baik dari sana .

Namun, saya menemukan pesan kesalahan ini sangat tidak intuitif dan saya mencoba untuk membuat rekan kerja saya sakit kepala.

Saya mencoba mencari tahu apakah ada tempat yang bisa saya modifikasi update intervalpengaturan ini .

  1. Apakah update intervalyang disebutkan dalam pesan kesalahan ini adalah pengaturan sisi klien atau sisi server?
  2. Jika dari sisi klien, bagaimana cara mengkonfigurasinya?
  3. Jika di sisi server, apakah ada yang tahu bagaimana / jika Nexus / Artifactory mengekspos pengaturan ini?
cprice404
sumber
11
Saya mendapat pesan kesalahan yang sama setelah menambahkan 1 ketergantungan lebih ke pom.xml saya. Bagi saya ini jelas BUG. Saya tidak mengerti mengapa ini terjadi! Jika saya menambahkan dependensi ke proyek saya dan saya menjalankan kompilasi mvn daripada seharusnya hanya mengunduh file jar. Perilaku ini benar-benar tidak masuk akal!
Robert Reiz
Saya baru saja mengalami ini dan setelah semua jawaban yang saya baca, langkah tambahan lainnya adalah mengimpor kembali proyek di Eclipse (dalam kasus saya). Itu terlalu aneh bahwa Eclipse terus menggangguku dengan sebuah plugin yang tidak ada dalam bahasa saya pom.xml.
Incognito
Sebuah pertanyaan penting bagi saya !! Terimakasih kawan!
Tn. Noddy
Bagi saya, ternyata repo tertentu ditautkan ke GitHub dan urlnya offline (mendapatkan 404). Saya memperbarui repo ke server internal kami dan itu berhasil.
cbmeeks

Jawaban:

286

Saya biasa memecahkan masalah ini dengan menghapus direktori artifak yang gagal di-download dalam repo lokal saya. Lain kali saya menjalankan perintah pakar unduhan artefak dipicu lagi. Karena itu saya akan mengatakan itu adalah pengaturan sisi klien.

Sisi Nexus (sisi server repo), masalah ini diselesaikan dengan mengonfigurasi tugas terjadwal. Sisi klien, ini dilakukan menggunakan -U, seperti yang telah Anda tunjukkan.

Christian Achilli
sumber
7
"Saya gunakan untuk menyelesaikan masalah ini dengan menghapus direktori artifak yang gagal untuk mengunduh dalam repo lokal saya." Ini berhasil untuk saya. Saya menggunakan Netbeans juga.
16
Jika Maven mencatat bahwa artefak yang di-cache tidak valid, mengapa tidak bisa menyelesaikannya sendiri?
Stefan
1
apa arti "mengonfigurasi tugas terjadwal" dan "ini dilakukan menggunakan -U", bisakah Anda memasukkannya ke dalam istilah UI Eclipse yang objektif?
user2568374
1
Saya berasumsi maksud Anda Eclipse IDE. Teorinya adalah Anda perlu mengunduh SNAPSHOT terbaru. Untuk melakukan itu, Anda perlu menambahkan parameter '-U' ke perintah maven Anda, mis. Mvn clean compile -U. Sekarang, Anda dapat menjalankan perintah pakar ini baik melalui baris perintah atau melalui Eclipse dengan mencentang kotak 'selalu perbarui snapshot'. Tidak yakin, saya menggunakan intellij hari ini. Bagian 'mengonfigurasi tugas terjadwal' merujuk ke konfigurasi tertentu yang ingin Anda miliki di server Nexus Anda. Yang terakhir ini tidak ada hubungannya dengan Eclipse.
Christian Achilli
10
Ini tidak menjawab pertanyaan aktual OPs.
8bitjunkie
116

Anda dapat menghapus direktori artefak gagal yang sesuai di repositori lokal Anda. Dan Anda juga bisa menggunakan -Utujuan. Itu akan melakukan pekerjaan. Ini bekerja dengan pakar 3. Jadi tidak perlu downgrade ke pakar 2.

kds
sumber
2
Mengapa mengacaukan konfigurasi repositori ketika itu bisa sangat sederhana?
Koraktor
9
Silakan baca pertanyaan dengan seksama sebelum Anda menjawab. OP bertanya bagaimana mengatur interval waktu, bukan bagaimana memaksa pembaruan.
i3ensays
2
Bukan jawaban untuk pertanyaan tetapi ini adalah apa yang orang butuhkan ketika mereka mencapai pengecualian ini. Karena ketika Anda bekerja pada pengembangan lib lokal, yang terbaik adalah menghapus lib semacam itu daripada membiarkan interval membingungkan Anda.
mcvkr
Kita harus memiliki repositori yang valid ditambahkan di bawah ~/.m2/settings.xml/<repositories>untuk menyelesaikan masalah ini dengan opsi -U
Kanagavelu Sugumar
64

Saya memiliki masalah terkait, tetapi jawaban Raghuram membantu. (Saya belum memiliki reputasi yang cukup untuk memilih jawabannya). Saya menggunakan Maven yang dibundel dengan NetBeans, dan mendapatkan hal yang sama "... di-cache di repositori lokal, resolusi tidak akan diulang kembali sampai interval pembaruan nexus telah berlalu atau pembaruan dipaksa -> kesalahan [Bantuan 1]" .

Untuk memperbaikinya saya menambahkan <updatePolicy>always</updatePolicy>ke file pengaturan saya (C: \ Program Files \ NetBeans 7.0 \ java \ maven \ conf \ settings.xml)

<profile>
  <id>nexus</id>
  <!--Enable snapshots for the built in central repo to direct -->
  <!--all requests to nexus via the mirror -->
  <repositories>
    <repository>
      <id>central</id>
      <url>http://central</url>
      <releases><enabled>true</enabled><updatePolicy>always</updatePolicy></releases>
      <snapshots><enabled>true</enabled><updatePolicy>always</updatePolicy></snapshots>
    </repository>
  </repositories>
 <pluginRepositories>
    <pluginRepository>
      <id>central</id>
      <url>http://central</url>
      <releases><enabled>true</enabled><updatePolicy>always</updatePolicy></releases>
      <snapshots><enabled>true</enabled><updatePolicy>always</updatePolicy></snapshots>
    </pluginRepository>
  </pluginRepositories>
</profile>
MrDrews
sumber
8
Tidak membantu dalam kasus saya.
arcy
64

Apa yang pada dasarnya terjadi adalah, Menurut default updatePolicy dari maven.Maven akan mengambil stoples dari repo setiap hari. Jadi jika selama upaya 1 internet Anda tidak berfungsi maka ia tidak akan mencoba mengambil tabung ini lagi sampai 24 jam dihabiskan.

Resolusi:

Baik digunakan

mvn -U clean install

di mana -U akan memaksa memperbarui repo

atau gunakan

<profiles>
    <profile>
      ...
      <repositories>
        <repository>
          <id>myRepo</id>
          <name>My Repository</name>
          <releases>
            <enabled>false</enabled>
            <updatePolicy>always</updatePolicy>
            <checksumPolicy>warn</checksumPolicy>
          </releases>
         </repository>
      </repositories>
      ...
    </profile>
  </profiles>

di settings.xml Anda

Sanjeev Guglani
sumber
39

Menurut referensi pengaturan :

updatePolicy: 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.

Contoh:

<profiles>
    <profile>
      ...
      <repositories>
        <repository>
          <id>myRepo</id>
          <name>My Repository</name>
          <releases>
            <enabled>false</enabled>
            <updatePolicy>always</updatePolicy>
            <checksumPolicy>warn</checksumPolicy>
          </releases>
         </repository>
      </repositories>
      ...
    </profile>
  </profiles>
  ...
</settings>
Raghuram
sumber
7
Terima kasih balasannya; Namun, saya telah bereksperimen sedikit dengan pengaturan "updatePolicy", dan tampaknya tidak berpengaruh pada "Tidak Ditemukan" / "Kegagalan Cached" / "resolusi tidak akan diulang kembali" kesalahan.
cprice404
23

Meskipun Anda dapat menyelesaikan ini dengan instalasi yang bersih (mengganti semua dependensi yang di-cache) seperti yang disarankan oleh @ Sanjeev-Gulgani dengan mvn -U clean install

Anda juga bisa menghapus ketergantungan cache yang menyebabkan masalah

mvn dependency:purge-local-repository -DmanualInclude="groupId:artifactId"

Lihat mvn docs untuk info lebih lanjut.

sfletche
sumber
9

Kesalahan ini terkadang bisa menyesatkan. 2 hal yang mungkin ingin Anda periksa:

  1. Apakah ada JAR aktual untuk ketergantungan pada repo? Pesan kesalahan Anda berisi URL tempat pencariannya, jadi buka di sana, lalu telusuri ke folder yang cocok dengan ketergantungan Anda. Apakah ada toples? Jika tidak, Anda perlu mengubah ketergantungan Anda. (misalnya, Anda bisa menunjuk pada ketergantungan orang tua tingkat atas, ketika Anda harus menunjuk pada sub proyek)

  2. Jika toples ada pada repo jarak jauh, maka hapus saja salinan lokal Anda. Ini akan berada di direktori home Anda (kecuali jika Anda mengonfigurasi berbeda) di bawah .m2 / repositori (ls -a untuk ditampilkan tersembunyi jika di Linux).

MattC
sumber
4
Ini tidak relevan dengan pertanyaan OP. Alasan mengapa kesalahan ditampilkan bukan itu intinya. OP ingin tahu cara mengatur interval coba lagi.
8bitjunkie
1
Ini mungkin masalah tersirat di balik pos OP dan ternyata menjadi masalah saya. Ternyata saya salah ketik di <groupId> saya yang dengan meninjau opsi satu menuntun saya ke jalan yang benar.
James Oravec
1
Pertanyaannya adalah bagaimana mengatur interval?
smilyface
7

Jika Anda menggunakan Eclipse kemudian pergi ke Windows -> Preferences -> Maven dan hapus centang pada kotak centang "Jangan perbarui dependensi secara otomatis dari repositori jauh".

Ini bekerja dengan Maven 3 juga.

ashoka
sumber
1
diverifikasi untuk: eclipse: Juno Service Release 2. m2e: v 1.3.1
user77115
8
Ini tidak menjawab pertanyaan OP.
8bitjunkie
5

Anda perlu menghapus semua file "_maven.repositori" dari repositori Anda.

Riadh
sumber
3
tidak membantu, atau setidaknya tidak dalam kasus saya
arcy
1
Ini berhasil untuk saya. Saya tidak menghapus semuanya, hanya yang ada di folder dependensi khusus itu
Piyin
5

Ini berfungsi setelah Anda menghapus ketergantungan terkait dari repositori pakar lokal Anda

/user/.m2/repository/path
Pravin
sumber
Ini berfungsi seperti pesona
Jadda
3

Jika Anda menggunakan Nexus sebagai repo proxy, pengaturan "Not Found Cache TTL" dengan nilai default 1440 menit (atau 24 jam). Menurunkan nilai ini dapat membantu (Gudang> Konfigurasi> Pengaturan Kedaluwarsa).

Lihat dokumentasi untuk info lebih lanjut.

chipiik
sumber
2

Bagaimana saya mendapat masalah ini,

Ketika saya berubah dari Eclipse Juno ke Luna, dan checkout proyek maven saya dari repo SVN, saya mendapat masalah yang sama saat membangun aplikasi.

Apa yang saya coba? Saya mencoba membersihkan repositori lokal dan kemudian memperbarui semua versi lagi menggunakan opsi -U. Tapi masalah saya berlanjut.

Lalu saya pergi ke Window -> Preferences -> Maven -> User Settings -> dan mengklik tombol Reindex di bawah Local Repository dan menunggu reindex terjadi.

Itu saja, masalahnya sudah teratasi.

Lyju I Edwinson
sumber
4
Ini tidak menjawab pertanyaan OP.
8bitjunkie
2

Untuk akhirnya menjawab pertanyaan judul: Ini adalah (pengaturan sisi klien) di (proyek, profil atau pengaturan)

[plugin]?[r|R]epository/[releases|snapshots]/updatePolicy

... tag.

Nilai-nilai yang mungkin (saat ini, maven: 3.6.0, tapi saya kira kompatibel dengan "jauh ke belakang") adalah:

/**
 * Never update locally cached data.
 */
public static final String UPDATE_POLICY_NEVER = "never";
/**
 * Always update locally cached data.
 */
public static final String UPDATE_POLICY_ALWAYS = "always";
/**
 * Update locally cached data once a day.
 */
public static final String UPDATE_POLICY_DAILY = "daily";
/**
 * Update locally cached data **every X minutes** as given by "interval:X".
 */
public static final String UPDATE_POLICY_INTERVAL = "interval";

Evaluasi tag ini saat ini (maven 3.6.0) dilaksanakan sebagai berikut:

public boolean isUpdatedRequired( RepositorySystemSession session, long lastModified, String policy )
{
    boolean checkForUpdates;
    if ( policy == null )
    {
        policy = "";
    }
    if ( RepositoryPolicy.UPDATE_POLICY_ALWAYS.equals( policy ) )
    {
        checkForUpdates = true;
    }
    else if ( RepositoryPolicy.UPDATE_POLICY_DAILY.equals( policy ) )
    {
        Calendar cal = Calendar.getInstance();
        cal.set( Calendar.HOUR_OF_DAY, 0 );
        cal.set( Calendar.MINUTE, 0 );
        cal.set( Calendar.SECOND, 0 );
        cal.set( Calendar.MILLISECOND, 0 );
        checkForUpdates = cal.getTimeInMillis() > lastModified;
    }
    else if ( policy.startsWith( RepositoryPolicy.UPDATE_POLICY_INTERVAL ) )
    {
        int minutes = getMinutes( policy );
        Calendar cal = Calendar.getInstance();
        cal.add( Calendar.MINUTE, -minutes );
        checkForUpdates = cal.getTimeInMillis() > lastModified;
    }
    else
    {
        // assume "never"
        checkForUpdates = false;
        if ( !RepositoryPolicy.UPDATE_POLICY_NEVER.equals( policy ) )
        {
            LOGGER.warn( "Unknown repository update policy '{}', assuming '{}'",
                    policy, RepositoryPolicy.UPDATE_POLICY_NEVER );
        }
    }
    return checkForUpdates;
}

..dengan:

private int getMinutes( String policy )
{
    int minutes;
    try
    {
        String s = policy.substring( RepositoryPolicy.UPDATE_POLICY_INTERVAL.length() + 1 );
        minutes = Integer.valueOf( s );
    }
    catch ( RuntimeException e )
    {
        minutes = 24 * 60;
        LOGGER.warn( "Non-parseable repository update policy '{}', assuming '{}:1440'",
                policy, RepositoryPolicy.UPDATE_POLICY_INTERVAL );
    }
    return minutes;
}

... di mana lastModified(file lokal) "timestamp yang dimodifikasi" dari / masing-masing artefak yang mendasarinya.


Khusus untuk interval:xpengaturan:

  • titik dua :tidak seketat itu - setiap karakter "tidak kosong" dapat melakukannya ( =, , ...).
  • nilai negatif x < 0harus menghasilkan "tidak pernah".
  • interval:0 Saya akan menganggap interval "minutely" (0-59 dtk atau di atas ...).
  • pengecualian format angka menghasilkan 24 * 60menit (~ "setiap hari").

..see: DefaultUpdatePolicyAnalyzer , DefaultMetadataResolver # resolMetadata () dan RepositoryPolicy

xerx593
sumber
1

Untuk pengguna Intellij , berikut ini berfungsi untuk saya:

Klik kanan pada paket Anda

Maven > Reimport 

dan

Maven > Generate Sources and Update Folders
Emerica
sumber
0

Agak dirilis .. saya mendapatkan

"[KESALAHAN] Gagal menjalankan tujuan pada proyek uji proyek: Tidak dapat menyelesaikan dependensi untuk myjarname proyek: jar: 1.0-0: Gagal menemukan core myjarname: bundel: 1.0-0 in di http://repo1.maven.org/maven2-cache dalam repositori lokal, resolusi tidak akan reattempted sampai interval pembaruan pusat telah berlalu atau pembaruan dipaksa -> [Bantuan 1] "

Kesalahan ini disebabkan oleh penggunaan yang tidak sengaja Maven 3sebagai gantinya Maven 2. Hanya mengira itu mungkin menghemat waktu seseorang, karena pencarian google awal saya membawa saya ke halaman ini.

sdanzig
sumber
2
Bagaimana jika proyek Anda memaksa Anda untuk menggunakan Maven 3? Apakah Anda memiliki petunjuk tentang apa yang berubah antara kedua versi?
Xr.
1
Persis seperti itulah masalah saya. Tidak tahu mengapa Maven 3 sangat berbeda dari 2. Terima kasih telah memposting ini dan menyelamatkan saya dari membuang waktu mencari solusi.
CatsAndCode
cara menginstal maven2 bukannya maven3?
triliunan
Pertanyaan yang sangat umum .. sistem operasi apa? Untuk Ubuntu, Anda dapat melakukan "sudo apt-get install maven2" ... atau untuk Linux / UNIX, Anda dapat mengunduh arsip dan mengompilasinya sendiri, menambahkannya ke jalur Anda. Coba: maluerarathnayaka.blogspot.com/2012/01/…
sdanzig
Ini berhasil untuk saya & sebenarnya saya tautkan kembali ke ini dari jawaban saya di sini .
shiri
0

Maven memiliki pengaturan updatePolicy untuk menentukan frekuensi untuk memeriksa pembaruan di repositori atau untuk menjaga repositori tetap sinkron dengan remote.

  • Nilai default untuk updatePolicy adalah setiap hari.
  • Nilai-nilai lain dapat selalu / tidak pernah / XX (menentukan interval dalam menit).

Contoh kode di bawah ini dapat ditambahkan ke file pengaturan pengguna pakar untuk mengonfigurasi updatePolicy.

<pluginRepositories>
    <pluginRepository>
        <id>Releases</id>
        <url>http://<host>:<port>/nexus/content/repositories/releases/</url>
        <releases>
            <enabled>true</enabled>
            <updatePolicy>daily</updatePolicy>
        </releases>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </pluginRepository>             
</pluginRepositories>
VYSAKHAN SREEKUMARAN KASTHURI
sumber
3
Ini tidak menjawab pertanyaan OP. OP jelas bahwa mereka mengerti apa masalahnya dan bagaimana memperbarui repositori m2 lokal mereka. OP bertanya di mana interval berada dan bagaimana mengubahnya. Tidak ada menyebutkan IDE sama sekali. Anda belum membaca pertanyaan.
8bitjunkie
@ 8bitjunkie jawaban ini cukup langsung pertanyaan: If client-side, how do I configure it?. Jawaban ini bukan tentang fitur IDE. Ini hanya konfigurasi penyimpanan mvn. The updatePolicyadalah interval OP yang bertanya tentang.
montrivo
Ini bisa menjadi jawaban yang diterima @ cprice404.
montrivo
0

Dalam kasus saya solusinya bodoh: Saya hanya punya versi ketergantungan yang salah.

Maria Pomazkina-Karpikova
sumber
0

Saya memiliki masalah ini dan uraian komprehensif yang diajukan dalam hal ini membantu saya untuk memperbaikinya.

Masalah yang dinyatakan kedua adalah masalah saya. Saya menggunakan repositori pihak ketiga yang baru saja saya tambahkan itu melakukan repositorybagian dari file pom dalam proyek saya. Saya menambahkan informasi repositori yang sama ke dalam pluginrepositoryuntuk menyelesaikan masalah ini.

epcpu
sumber
0

Saya memiliki kesalahan serupa dengan artefak yang berbeda.

<...> di-cache dalam repositori lokal, resolusi tidak akan diulang kembali sampai interval pembaruan pusat telah berlalu atau pembaruan dipaksa

Tidak ada solusi yang dijelaskan di atas yang berfungsi untuk saya. Saya akhirnya menyelesaikan ini di IntelliJ IDEA dengan File> Valid Cache / Restart ...> Validate dan Restart .

Tidak
sumber
0

Dalam kasus saya, saya punya banyak proyek

rootProject
 |-> contractProject (using Project Lombok)
 |-> domainProject (dependency on contractProject)

Ketika saya melakukan "mvn clean install" dari direktori "domainProject", saya akan mengatakan kesalahan.

Ketika saya melakukan "mvn clean install" dari direktori "projectRoot", masalahnya hilang.

ChetPrickles
sumber