Jawaban:
Versi snapshot di Maven adalah salah satu yang belum dirilis.
Idenya adalah bahwa sebelum sebuah 1.0
rilis (atau rilis lainnya) dilakukan, terdapat 1.0-SNAPSHOT
. Versi itulah yang mungkin terjadi 1.0
. Ini pada dasarnya " 1.0
sedang dikembangkan". Ini mungkin dekat dengan 1.0
rilis nyata , atau cukup jauh (tepat setelah 0.9
rilis, misalnya).
Perbedaan antara versi "nyata" dan versi snapshot adalah bahwa snapshot mungkin mendapatkan pembaruan. Itu berarti bahwa mengunduh 1.0-SNAPSHOT
hari 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.
1.0-DEVELOPMENT
", atau seperti " 1.0-INPROGRESS
", mengapa orang harus menggunakan istilah yang tidak jelas
Tiga jawaban lainnya memberi Anda visi yang baik tentang apa -SNAPSHOT
versi itu. Saya hanya ingin menambahkan beberapa informasi mengenai perilaku Maven ketika menemukan SNAPSHOT
ketergantungan.
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.xml
atau pom.xml
) untuk mengambil dependensi ini. Kemudian, itu akan menyalinnya ke repositori lokal, untuk membuatnya tersedia untuk build berikutnya.
Sebagai contoh, foo-1.0.jar
perpustakaan 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.jar
perpustakaan, 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 XXX
bisa:
SNAPSHOT
versi akan ditangani sebagai pustaka yang stabil.(model pengaturan.xml dapat ditemukan di sini)
SNAPSHOT
versi: mvn clean package -U
sesuai tutorial maven
-U
bendera. Mungkin tidak melakukan apa yang Anda harapkan karena MNG-4142 .
mvn install
untuk 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 install
sepertinya tidak mengubahnya di repo lokal saya. Apakah itu perilaku yang diharapkan? Bisakah saya tidak menggunakan kembali versi dan menimpanya mvn install
setelah membuat perubahan?
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 .
"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. ;)
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>
Contoh proses rilis pakar
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 -SNAPSHOT
tetapi 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.4
untuk menjadi versi "rilis" jika kami merilisnya ke publik, tetapi ini bukan "rilis final". Versi semantik dengan jelas mengatakan bahwa sesuatu seperti itu -beta.4
adalah versi "pra-rilis", jadi tidak masuk akal untuk disebut versi "rilis", bahkan tanpa versi itu -SNAPSHOT
. Bahkan menurut definisi bahkan -rc.5
adalah 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).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.
biasanya di pakar kami memiliki dua jenis build 1) Snapshot build 2) Release build
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.
Rilis build: Release berarti menghapus SNAPSHOT pada versi untuk build, ini adalah versi build reguler.
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
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.
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.
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.