Bagaimana cara memaksa Maven menggunakan repositori lokal saya daripada pergi ke repositori jarak jauh untuk mengambil artefak?

101

Saya menggunakan Maven 3.3.3 dengan Java 8 di Mac Yosemite. Saya memiliki proyek multi-modul.

    <modules>
            <module>first-module</module>
            <module>my-module</module></modules>

Ketika saya membangun salah satu modul anak saya, misalnya, "modul-saya" dari atas, menggunakan "mvn clean install", build tersebut mencoba mengunduh artefak modul anak dari repositori jarak jauh yang telah saya tentukan di ~ / .m2 saya /settings.xml. Outputnya di bawah

[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building my-module 87.0.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
Downloading: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/maven-metadata.xml
Downloading: http://download.java.net/maven/2/org/mainco/subco/first-module/87.0.0-SNAPSHOT/maven-metadata.xml
Downloaded: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/maven-metadata.xml (788 B at 0.9 KB/sec)
Downloading: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/first-module-87.0.0-20151104.200545-4.pom

Bagaimana cara memaksa Maven untuk memeriksa ~ / .m2 / repositori lokal saya terlebih dahulu sebelum mencoba mengunduh dari repositori jarak jauh? Di bawah ini adalah tempat saya menetapkan repositori jarak jauh di file ~ / .m2 / settings.xml saya…

<profile>
    <id>releases</id>
    <activation>
        <property>
            <name>!releases.off</name>
        </property>
    </activation>
    <repositories>
        <repository>
            <id>releases</id>
            <url>https://my.remoterepository.com/nexus/content/repositories/releases/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
</profile>
<profile>
    <id>snapshots</id>
    <activation>
        <property>
            <name>!snapshots.off</name>
        </property>
    </activation>
    <repositories>
        <repository>
            <id>snapshots</id>
            <url>https://my.remoterepository.com/nexus/content/repositories/snapshots/</url>
            <releases>
                <enabled>false</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>
</profile>

Sunting: Menanggapi jawaban yang mengatakan bahwa unduhan terjadi ketika artefak tidak ada, di bawah ini adalah output terminal tempat saya membuktikan file itu ada di repo saya tetapi Maven tetap mencoba mengunduhnya ...

Daves-MacBook-Pro-2:my-module davea$ ls -al ~/.m2/repository/org/mainco/subco/first-module/87.0.0-SNAPSHOT/first-module-87.0.0-SNAPSHOT.jar 
-rw-r--r--  1 davea  staff  10171 Nov  5 10:22 /Users/davea/.m2/repository/org/mainco/subco/first-module/87.0.0-SNAPSHOT/first-module-87.0.0-SNAPSHOT.jar
Daves-MacBook-Pro-2:my-module davea$ mvn clean install
[INFO] Scanning for projects...
[WARNING] 
[WARNING] Some problems were encountered while building the effective model for org.mainco.subco:my-module:jar:87.0.0-SNAPSHOT
[WARNING] 'build.plugins.plugin.(groupId:artifactId)' must be unique but found duplicate declaration of plugin org.apache.maven.plugins:maven-antrun-plugin @ org.mainco.subco:my-module:[unknown-version], /Users/davea/Documents/sb_workspace/my-module/pom.xml, line 678, column 12
[WARNING] 
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING] 
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING] 
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building my-module 87.0.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
Downloading: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/maven-metadata.xml
Downloading: http://download.java.net/maven/2/org/mainco/subco/first-module/87.0.0-SNAPSHOT/maven-metadata.xml
Downloaded: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/maven-metadata.xml (788 B at 0.8 KB/sec)
Downloading: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/first-module-87.0.0-20151106.043202-8.pom
Downloaded: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/first-   module-87.0.0-20151106.043202-8.pom (3 KB at 21.9 KB/sec)
Downloading: http://download.java.net/maven/2/org/mainco/subco/subco/87.0.0-SNAPSHOT/maven-metadata.xml
Downloading: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/subco/87.0.0-SNAPSHOT/maven-metadata.xml
Dave
sumber
2
Maven tidak memeriksa repositori lokal Anda sebelum mencoba untuk men-download sebuah artefak dari repositori jauh. Apakah Anda yakin orang lokal Anda memiliki artefak ini sebelum Anda mencoba membangun ini? Anda dapat memeriksa repositori lokal Anda sekarang dan tetap mencoba membangun lain lagi. Selain itu, Anda dapat menentukan di mana repositori lokal Anda berada di settings.xml(lihat di sini ).
mystarrocks
Meskipun saya belum menentukan repositori saya di file settings.xml saya, ini adalah default yang disiapkan Maven untuk saya - ~ / .m2 / repositori. Apakah saya harus menentukannya meskipun itu default?
Dave
Bagi saya, ada file lain di repositori lokal saya, seperti * .sha1 atau * .lastUpdate. menghapus file lain kecuali * .jar dan * .pom akan mencegah maven mengunduh ulang file dari repositori jarak jauh
Harun

Jawaban:

46

Dependensi memiliki versi snapshot. Untuk snapshot, Maven akan memeriksa repositori lokal dan jika artefak yang ditemukan di repositori lokal terlalu tua, Maven akan mencoba mencari yang diperbarui di repositori jarak jauh. Itu mungkin yang Anda lihat.

Perhatikan bahwa perilaku ini dikontrol oleh updatePolicydirektif dalam konfigurasi repositori (yang secara dailydefault untuk repositori snapshot).

Andreas Veithen
sumber
16
Apakah mungkin untuk "menimpa" ini dengan argumen perintah konsol? Seperti: mvn clean install -FORCE_COMMAND
Naxos84
21
"Terlalu tua" artinya apa? Ia mengambil snapshot terbaru yang dapat ditemukannya, apakah itu lokal atau jarak jauh? Itu pasti perilaku yang mengerikan. Jika saya baru saja membuat snapshot, saya benar-benar ingin menggunakannya, bukan yang CI build beberapa saat kemudian.
Tom Quarendon
Tolong jelaskan lebih lanjut tentang apa artinya "Terlalu tua"?
Đỗ Công Bằng
34

Gunakan mvn --helpdan Anda dapat melihat daftar opsi.

Ada opsi seperti -nsu,--no-snapshot-updates Suppress SNAPSHOT updates

Jadi gunakan perintah mvn install -nsudapat memaksa kompilasi dengan repositori lokal.

Zheng Zhongqi
sumber
10
Anda juga dapat menggunakan -ountuk perilaku maven "offline"
Sean
8
Opsi -nsu tidak mencegah mvn untuk mencoba dan gagal mengunduh artefak dari jarak jauh jika belum diunduh alih-alih menggunakan build lokal seperti ketika artefak dibuat dan dipasang secara lokal. -
pengguna1767316
Saya memiliki masalah yang sama dengan artefak yang belum diunduh dan ini memperbaikinya untuk saya: maven.apache.org/general.html#importing-jars
Luigi Cristalli
16

Untuk benar-benar memaksa maven hanya menggunakan repo lokal Anda, Anda dapat menjalankannya dengan mvn <goals> -o. The -omemberitahu maven untuk membiarkan Anda bekerja "offline", dan itu akan tetap off jaringan.

Sean
sumber
5
Opsi -o tidak mencegah mvn untuk mencoba dan gagal mengunduh artefak dari jarak jauh jika belum diunduh alih-alih menggunakan build lokal seperti saat artefak dibuat dan dipasang secara lokal.
pengguna1767316
2
itu benar - jika Anda tidak memiliki salinan lokal, Anda kurang beruntung. Ini berguna untuk proyek yang telah Anda buat sebelumnya, tetapi berpotensi memiliki perubahan SNAPSHOT terbaru yang tidak Anda pedulikan.
Sean
Atau bahkan jika Anda tidak pernah membangun proyek, Anda dapat mempersiapkannya untuk dibuat secara offline denganmvn dependency:go-offline
Aldian
Bagaimana jika Anda memiliki salinan lokal yang baru saja Anda instal (jadi tidak pernah diterapkan / tersedia di repo snapshot jarak jauh)?
Vivek Chavda
1
Ah, saya baru saja membuat proyek pom dengan sekumpulan dependensi, tetapi tidak menentukan <type> pom </type> dalam proyek yang memakannya, jadi ia sedang mencari jar (dan tentu saja tidak dapat menemukannya, bahkan dalam mode offline)
Vivek Chavda
5

Ikuti langkah-langkah di bawah ini:

    1. Pastikan untuk menghapus semua isi folder jar yang ada di lokal Anda kecuali toples yang ingin Anda simpan.
      Misalnya file seperti .repositories, .pom, .sha1, .lastUpdated dll.
    1. Jalankan mvn clean install -operintah

Ini akan membantu untuk menggunakan file jar repositori lokal daripada menghubungkan ke repositori apa pun.

Madhu
sumber
1
Hanya menghapus *.repositoriesdan *.sha1file berfungsi untuk saya
DLight
4

Dalam kasus saya, saya memiliki proyek multi modul seperti Anda. Saya harus mengubah ID grup dari salah satu perpustakaan eksternal yang menjadi tempat proyek saya bergantung seperti yang ditunjukkan di bawah ini.

Dari:

<dependencyManagement>
    <dependency>
        <groupId>org.thirdparty</groupId>
        <artifactId>calculation-api</artifactId>
        <version>2.0</version>
        <type>jar</type>
        <scope>provided</scope>
    </dependency>
<dependencyManagement>

Untuk:

<dependencyManagement>
   <dependency>
      <groupId>org.thirdparty.module</groupId>
        <artifactId>calculation-api</artifactId>
        <version>2.0</version>
        <type>jar</type>
        <scope>provided</scope>
    </dependency>
<dependencyManagement>

Perhatikan bagian <groupId>. Ternyata saya lupa memodifikasi bagian submodul terkait yang menentukan ketergantungan ini di file pom mereka.

Itu membuat saya sangat gila karena modulnya tersedia secara lokal.

Willa
sumber
2

Opsi -o tidak berfungsi untuk saya karena artefak masih dalam pengembangan dan belum diunggah dan maven (3.5.x) masih mencoba mengunduhnya dari repositori jarak jauh karena ini pertama kalinya, sesuai dengan kesalahan yang saya dapatkan.

Namun ini memperbaikinya untuk saya: https://maven.apache.org/general.html#importing-jars

Setelah penginstalan manual ini, Anda juga tidak perlu menggunakan opsi offline.

MEMPERBARUI

Saya baru saja membangun kembali ketergantungan dan saya harus mengimpornya kembali: yang biasa mvn clean installtidak cukup bagi saya

Luigi Cristalli
sumber
2

Bahkan ketika mempertimbangkan semua jawaban di atas, Anda mungkin masih mengalami masalah yang akan menghentikan maven offline build Anda dengan kesalahan. Terutama, Anda mungkin mengalami peringatan sebagai berikut:

[WARNING] The POM for org.apache.maven.plugins:maven-resources-plugin:jar:2.6 is missing, no dependency information available

Peringatan tersebut akan segera diikuti oleh kesalahan lebih lanjut dan maven akan dihentikan.

Bagi kami, cara teraman untuk membangun offline dengan cache offline maven yang dibuat mengikuti petunjuk di atas adalah dengan menggunakan parameter offline maven berikut:

mvn -o -llr -Dmaven.repo.local=<path_to_your_offline_cache> ...

Terutama, opsi -llr mencegah Anda dari keharusan menyetel cache lokal Anda seperti yang diusulkan dalam jawaban # 4.

Juga perhatikan bahwa parameter localRepository di settings.xml disetel sebagai berikut:

<localRepository>${user.home}/.m2/repository</localRepository>
ThoR
sumber
0

Saya memiliki masalah yang sama persis. Menjalankan mvn clean installalih-alih mvn clean compilemenyelesaikannya. Perbedaan hanya terjadi saat menggunakan multi-maven-project karena dependensi project diunggah ke repositori lokal dengan menggunakan install.

GJohannes
sumber
-1

Maven selalu memeriksa repositori lokal Anda terlebih dahulu, namun ketergantungan Anda perlu diinstal di repo Anda agar maven dapat menemukannya.

Jalankan mvn installmodul dependensi Anda terlebih dahulu, lalu buat modul dependen Anda.

Oliver
sumber
1
Saya telah mengedit pertanyaan saya untuk menunjukkan bahwa artefak ada di repo (perhatikan perintah "ls -al" yang saya jalankan. Namun Maven tetap mencoba untuk mendownloadnya. Ada ide lain?
Dave
6
@Oliver: Anda kehilangan fakta bahwa untuk artefak di repositori lokal, Maven mungkin masih berkonsultasi dengan repositori jarak jauh jika artefak tersebut adalah snapshot yang terlalu tua.
Andreas Veithen