Apa itu Snapshot Maven dan mengapa kita membutuhkannya?

Jawaban:

1013

Versi snapshot di Maven adalah salah satu yang belum dirilis.

Idenya adalah bahwa sebelum sebuah 1.0rilis (atau rilis lainnya) dilakukan, terdapat 1.0-SNAPSHOT. Versi itulah yang mungkin terjadi 1.0 . Ini pada dasarnya " 1.0sedang dikembangkan". Ini mungkin dekat dengan 1.0rilis nyata , atau cukup jauh (tepat setelah 0.9rilis, misalnya).

Perbedaan antara versi "nyata" dan versi snapshot adalah bahwa snapshot mungkin mendapatkan pembaruan. Itu berarti bahwa mengunduh 1.0-SNAPSHOThari ini mungkin memberikan file yang berbeda dari mengunduhnya kemarin atau besok.

Biasanya, dependensi snapshot hanya boleh ada selama pengembangan dan tidak ada versi yang dirilis (yaitu tidak ada snapshot) harus memiliki ketergantungan pada versi snapshot.

Joachim Sauer
sumber
67
@amphibient: Tidak, snapshot belum tentu lebih stabil: itu hanya build terbaru. Cuplikan mendahului rilis yang sebenarnya, itu tidak datang setelah itu. Memang, nomor versi biasanya tidak merujuk ke cabang.
avandeursen
9
Snapshot @avandeursen tidak harus memiliki semantik yang Anda klaim. Anda dapat memiliki "master-SNAPSHOT" dan kemudian membuat rilis 1.0. tidak harus "FutureVersion-SNAPSHOT", juga belum pernah ada sebelum rilis. Segala sesuatu yang lain benar - itu adalah referensi yang tidak stabil untuk target yang bergerak dan tidak dapat diandalkan untuk menghasilkan bangunan yang berulang.
Scott Carey
3
Terima kasih @ScottCarey. "Umumnya mendahului" mungkin akan lebih akurat, karena bahkan tidak ada jaminan bahwa "target bergerak" pada akhirnya akan ada.
avandeursen
1
@ Jay: tidak, sejauh yang saya tahu tidak ada cara untuk secara eksplisit merujuk SNAPSHOT tertentu, mereka tidak dapat dialamatkan / dipertukarkan oleh desain. Jika Anda membutuhkan versi berbutir halus, maka Anda harus melepaskan kandidat rilis dengan string versi spesifik (-RC1, -RC2 atau sesuatu seperti itu).
Joachim Sauer
14
Mengapa mereka tidak bisa menyebutnya " 1.0-DEVELOPMENT", atau seperti " 1.0-INPROGRESS", mengapa orang harus menggunakan istilah yang tidak jelas
uh_big_mike_boi
792

Tiga jawaban lainnya memberi Anda visi yang baik tentang apa -SNAPSHOTversi itu. Saya hanya ingin menambahkan beberapa informasi mengenai perilaku Maven ketika menemukan SNAPSHOTketergantungan.

Saat Anda membangun aplikasi, Maven akan mencari dependensi di repositori lokal . Jika versi stabil tidak ditemukan di sana, itu akan mencari repositori jarak jauh (didefinisikan dalam settings.xmlatau pom.xml) untuk mengambil dependensi ini. Kemudian, itu akan menyalinnya ke repositori lokal, untuk membuatnya tersedia untuk build berikutnya.

Sebagai contoh, foo-1.0.jarperpustakaan dianggap sebagai versi stabil , dan jika Maven menemukannya di repositori lokal, itu akan menggunakan yang ini untuk membangun saat ini.

Sekarang, jika Anda memerlukan foo-1.0-SNAPSHOT.jarperpustakaan, Maven akan tahu bahwa versi ini tidak stabil dan dapat berubah. Itu sebabnya Maven akan mencoba mencari versi yang lebih baru di repositori jarak jauh, bahkan jika versi perpustakaan ini ditemukan di repositori lokal. Namun, pemeriksaan ini dilakukan hanya sekali sehari. Itu berarti bahwa jika Anda memiliki foo-1.0-20110506.110000-1.jar(mis. Perpustakaan ini telah dihasilkan pada 2011/05/06 pukul 11:00:00) di repositori lokal Anda, dan jika Anda menjalankan build Maven lagi di hari yang sama, Maven tidak akan memeriksa repositori untuk versi yang lebih baru.

Maven memberi Anda cara untuk mengubah kebijakan pembaruan ini dalam definisi repositori Anda:

<repository>
    <id>foo-repository</id>
    <url>...</url>
    <snapshots>
        <enabled>true</enabled>
        <updatePolicy>XXX</updatePolicy>
    </snapshots>
</repository>

dimana XXXbisa:

  • selalu : Maven akan memeriksa versi yang lebih baru di setiap bangunan;
  • setiap hari , nilai default;
  • interval: XXX : interval dalam menit (XXX)
  • tidak pernah : Maven tidak akan pernah mencoba mengambil versi lain. Itu hanya akan dilakukan jika tidak ada secara lokal. Dengan konfigurasi, SNAPSHOTversi akan ditangani sebagai pustaka yang stabil.

(model pengaturan.xml dapat ditemukan di sini)

Romain Linsolas
sumber
2
Tampaknya mungkin untuk menggunakan saklar baris perintah untuk memaksa maven mengunduh ulang semua SNAPSHOTversi: mvn clean package -Usesuai tutorial maven
Dimitry K
3
Hati-hati dengan -Ubendera. Mungkin tidak melakukan apa yang Anda harapkan karena MNG-4142 .
Kevin Cross
3
Juga patut disebutkan bahwa praktik yang baik mengharuskan Anda tidak menggunakan dependensi snapshot ketika Anda datang untuk membuat versi rilis, dan memang Maven Release Plugin akan gagal jika ada dependensi snapshot hadir.
RCross
2
Saya berlari mvn installuntuk menginstal toples versi 1.0-SNAPSHOT ke repo lokal saya. Hari berikutnya saya membuat perubahan pada proyek tetapi tidak mengubah versi - maka ketika menjalankannya mvn installsepertinya tidak mengubahnya di repo lokal saya. Apakah itu perilaku yang diharapkan? Bisakah saya tidak menggunakan kembali versi dan menimpanya mvn installsetelah membuat perubahan?
Don Cheadle
1
@mmcrae AFAIK itu harus diperbarui. Itulah yang dilakukan tujuan pemasangan , memperbarui stoples SNAPSHOT lokal. Apakah Anda menemukan sesuatu yang lain?
Johnny
73

Istilah "SNAPSHOT" berarti bahwa build adalah snapshot dari kode Anda pada waktu tertentu.

Ini biasanya berarti bahwa versi ini masih dalam pengembangan berat.

Ketika kode sudah siap dan sekarang saatnya untuk melepaskannya, Anda ingin mengubah versi yang tercantum dalam POM. Kemudian alih-alih memiliki "SNAPSHOT" Anda akan menggunakan label seperti "1.0".

Untuk bantuan tentang versi, lihat spesifikasi Semantic Versioning .

jjnguy
sumber
Dalam hal versi semantik , rilis -SNAPSHOT akan menjadi pra-rilis: " Versi pra-rilis menunjukkan bahwa versi tersebut tidak stabil dan mungkin tidak memenuhi persyaratan kompatibilitas yang dimaksud seperti yang ditunjukkan oleh versi normal yang terkait. Contoh: 1.0.0 -alpha, 1.0.0-alpha.1, 1.0.0-0.3.7, 1.0.0-x.7.z.92. "
avandeursen
3
Bagi saya itu terdengar seperti "SNAPSHOT" bukan "snapshot kode Anda pada waktu tertentu" melainkan "versi terbaru dari kode yang tersedia." Jika ini HTTP, itu akan menjadi bendera yang mengatakan, "Jangan repot-repot melakukan KEPALA, tetap dapatkan apa pun yang ada di server." Memang, hampir kebalikan dari "kode pada waktu tertentu."
lilbyrdie
Apa itu pengembangan "berat"?
Joker
1
@Joker "berat" adalah ketika banyak hal berubah (fitur baru, refactoring, dll.)
robert
28

"Rilis" adalah versi final untuk versi yang tidak berubah.

"Snapshot" adalah build yang dapat digantikan oleh build lain yang memiliki nama yang sama. Ini menyiratkan bahwa bangunan dapat berubah kapan saja dan masih dalam pengembangan aktif.

Anda memiliki artefak berbeda untuk bangunan berbeda berdasarkan kode yang sama. Misalnya Anda mungkin punya satu dengan debugging dan satu tanpa. Satu untuk Java 5.0 dan satu untuk Java 6. Secara umum lebih mudah untuk memiliki satu build yang melakukan semua yang Anda butuhkan. ;)

Peter Lawrey
sumber
21

Versi Maven dapat berisi string literal "SNAPSHOT" untuk menandakan bahwa suatu proyek saat ini sedang dalam pengembangan aktif.

Misalnya, jika proyek Anda memiliki versi "1.0-SNAPSHOT" dan Anda menyebarkan artefak proyek ini ke repositori Maven, Maven akan memperluas versi ini ke "1.0-20080207-230803-1" jika Anda akan meluncurkan rilis di 11 : 20:00 pada tanggal 7 Februari 2008 UTC. Dengan kata lain, ketika Anda menggunakan snapshot, Anda tidak membuat rilis komponen perangkat lunak; Anda merilis snapshot komponen pada waktu tertentu.

Jadi terutama versi snapshot digunakan untuk proyek-proyek dalam pengembangan aktif. Jika proyek Anda bergantung pada komponen perangkat lunak yang dalam pengembangan aktif, Anda dapat bergantung pada rilis snapshot, dan Maven secara berkala akan mencoba mengunduh snapshot terbaru dari repositori ketika Anda menjalankan build. Demikian pula, jika rilis sistem Anda berikutnya akan memiliki versi "1.8," proyek Anda akan memiliki versi "1.8-SNAPSHOT" hingga dirilis secara resmi.

Misalnya, ketergantungan berikut akan selalu mengunduh JAR pengembangan musim semi terbaru:

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring</artifactId>
        <version>1.8-SNAPSHOT”</version>
    </dependency>

Maven

Contoh proses rilis pakar

masukkan deskripsi gambar di sini

Joby Wilson Mathews
sumber
6

Saya ingin menjelaskan tentang terminologi. Jawaban lain memberikan penjelasan yang baik tentang apa versi "snapshot" dalam konteks Maven. Tetapi apakah ini berarti bahwa versi non-snapshot harus disebut sebagai versi "rilis"?

Ada beberapa ketegangan antara ide versi semantik dari versi "rilis", yang tampaknya merupakan versi apa pun yang tidak memiliki kualifikasi seperti -SNAPSHOTtetapi juga tidak memiliki kualifikasi seperti -beta.4; dan ide ide Maven tentang versi "rilis", yang sepertinya hanya memasukkan tidak adanya -SNAPSHOT.

Dengan kata lain, ada ambiguitas semantik tentang apakah "rilis" berarti "kita dapat merilisnya ke Maven Central" atau "perangkat lunak tersebut dalam rilis finalnya ke publik". Kami dapat mempertimbangkan -beta.4untuk menjadi versi "rilis" jika kami merilisnya ke publik, tetapi ini bukan "rilis final". Versi semantik dengan jelas mengatakan bahwa sesuatu seperti itu -beta.4adalah versi "pra-rilis", jadi tidak masuk akal untuk disebut versi "rilis", bahkan tanpa versi itu -SNAPSHOT. Bahkan menurut definisi bahkan -rc.5adalah kandidat rilis , bukan rilis yang sebenarnya, meskipun kami dapat mengizinkan akses publik untuk pengujian.

Meskipun demikian, Maven, menurut pendapat saya, sepertinya lebih tepat untuk memanggil versi "rilis" yang tidak memiliki kualifikasi sama sekali, bahkan tidak -beta.4. Mungkin nama yang lebih baik untuk versi non-snapshot Maven akan menjadi versi "stabil" (terinspirasi oleh jawaban lain ). Dengan demikian kita akan memiliki:

  • 1.2.3-beta.4-SNAPSHOT: Versi snapshot dari versi pra-rilis.
  • 1.2.3-SNAPSHOT: Versi snapshot dari versi rilis.
  • 1.2.3-beta.4: Versi stabil dari versi pra-rilis.
  • 1.2.3: Versi rilis (yang merupakan versi stabil, non-snapshot, jelas).
Garret Wilson
sumber
Apakah Anda memiliki info tentang bagaimana maven menangani metadata build atau konvensi penamaan pra-rilis? Maksudku, kita semua tahu bahwa alfa mendahului beta, tetapi apakah pakar tahu? Bahkan jika itu mengambil 1.2.3-beta.4 sebagai rilis stabil, apakah setidaknya tahu bahwa 1.2.3 SETELAH itu?
DGoiko
5

Ini adalah tampilan snapshot untuk repositori dan dalam hal ini tidak diaktifkan, yang berarti repositori yang disebutkan di sini stabil dan tidak perlu ada pembaruan.

<project>
    ...
    <repositories>
        <repository>
            <id>lds-main</id>
            <name>LDS Main Repo</name>
            <url>http://code.lds.org/nexus/content/groups/main-repo</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
</project>

Kasus lain adalah untuk:

<snapshots>
        <enabled>true</enabled>
</snapshots>

yang berarti Maven akan mencari pembaruan untuk repositori ini. Anda juga dapat menentukan interval untuk pembaruan dengan tag.

Kati Holasz
sumber
5

biasanya di pakar kami memiliki dua jenis build 1) Snapshot build 2) Release build

  1. pembuatan snapshot: SNAPSHOT adalah versi khusus yang menunjukkan salinan penyebaran saat ini tidak seperti versi biasa, maven memeriksa versi untuk setiap build di repositori jarak jauh sehingga pembuatan snapshot tidak lain adalah build pengembangan.

  2. Rilis build: Release berarti menghapus SNAPSHOT pada versi untuk build, ini adalah versi build reguler.

Venky Vungarala
sumber
3

cukup snapshot berarti itu adalah versi yang tidak stabil.

ketika versi menyertakan snapshot seperti 1.0.0 -SNAPSHOT berarti itu bukan versi stabil dan mencari repositori jarak jauh untuk menyelesaikan dependensi

shanika prasangika
sumber
1

memahami konteks SDLC akan membantu memahami perbedaan antara foto dan rilis. Selama proses pengembang pengembang semua berkontribusi fitur mereka ke cabang baseline. Pada titik tertentu pemimpin berpikir fitur yang cukup telah terakumulasi maka dia akan memotong cabang rilis dari cabang dasar. Semua bangunan sebelum titik waktu ini adalah snapshot. Membangun pos ke titik ini adalah rilis. Perlu dicatat, rilis build dapat berubah juga sebelum pergi ke produksi jika ada cacat tempat selama pengujian rilis.

CCNA
sumber
1

Snapshot berarti tergantung pada konfigurasi Anda, Maven akan memeriksa perubahan terbaru pada ketergantungan khusus. Snapshot tidak stabil karena sedang dalam pengembangan tetapi jika pada proyek khusus perlu memiliki perubahan terbaru Anda harus mengkonfigurasi versi ketergantungan Anda ke versi snapshot. Skenario ini terjadi di organisasi besar dengan banyak produk yang saling terkait erat satu sama lain.

Mahdi Soltani
sumber
0

Seperti namanya, snapshot mengacu pada keadaan proyek dan ketergantungannya pada saat itu. Setiap kali pakar menemukan SNAPSHOT yang lebih baru dari proyek, ia mengunduh dan mengganti file .jar yang lebih lama dari proyek di repositori lokal.

Versi snapshot digunakan untuk proyek dalam pengembangan aktif. Jika proyek Anda bergantung pada komponen perangkat lunak yang dalam pengembangan aktif, Anda dapat bergantung pada rilis snapshot, dan Maven secara berkala akan mencoba mengunduh snapshot terbaru dari repositori ketika Anda menjalankan build.

Sourabh Bhavsar
sumber