Maven Anlık Görüntüsü tam olarak nedir ve neden buna ihtiyacımız var?


Yanıtlar:


1013

Maven'deki anlık görüntü sürümü, yayınlanmamış bir sürümdür.

Fikir şu ki, bir sürüm (veya başka bir sürüm) yapılmadan önce bir 1.0var 1.0-SNAPSHOT. Bu sürüm ne olabilir 1.0 . Temel olarak " 1.0geliştirme aşamasında". Bu gerçek bir sürüme yakın olabilir 1.0veya oldukça uzak olabilir ( 0.9örneğin sürümden hemen sonra ).

"Gerçek" sürüm ile anlık görüntü sürümü arasındaki fark, anlık görüntülerin güncelleme alabilmesidir. Bu, 1.0-SNAPSHOTbugün indirmenin, dün veya yarın indirmekten farklı bir dosya verebileceği anlamına gelir .

Genellikle, anlık görüntü bağımlılıkları yalnızca geliştirme sırasında bulunmalıdır ve yayımlanan sürümlerin (yani anlık görüntü olmayanların) anlık görüntü sürümüne bağımlılığı olmamalıdır.


67
@amphibient: Hayır, anlık görüntü daha kararlı değil : sadece en son sürüm . Anlık görüntü gerçek sürümden önce gelir , bundan sonra gelmez. Aslında, sürüm numaraları tipik olarak dallara işaret etmez.
avandeursen

9
@avandeursen enstantanelerinin iddia ettiğiniz semantiklere sahip olması gerekmez. "Master-SNAPSHOT" olabilir ve daha sonra 1.0 sürümü yapabilirsiniz. "FutureVersion-SNAPSHOT" olması ya da bir sürümün öncesinde yer alması gerekmez. Her şey doğru olsa da - hareketli bir hedefe kararsız bir referanstır ve tekrarlanabilir bir yapı üretmek için güvenilemez.
Scott Carey

3
Teşekkürler @ ScottCarey. "Yaygın olarak öncekiler" muhtemelen daha doğru olacaktır, çünkü "hareketli hedef" in sonunda var olacağına dair bir garanti bile yoktur.
avandeursen

1
@Jay: hayır, bildiğim kadarıyla belirli bir SNAPSHOT'a açıkça başvurmanın bir yolu olmadığından, tasarımla adreslenemez / değiştirilemezler. Ayrıntılı bir sürüm oluşturmaya ihtiyacınız varsa, belirli sürüm dizelerine (-RC1, -RC2 veya bunun gibi) sahip sürüm adaylarını serbest bırakmanız gerekir.
Joachim Sauer

14
Neden sadece " 1.0-DEVELOPMENT" ya da " 1.0-INPROGRESS" olarak adlandırmıyorlar? Neden insanlar belli olmayan terimler kullanmak zorunda?
uh_big_mike_boi

792

Diğer üç cevap size bir -SNAPSHOTsürümün ne olduğu konusunda iyi bir görüş sağlar . Ben sadece Maven bir davranış bulduğu zaman davranışları hakkında bazı bilgiler eklemek istedim.SNAPSHOT bağımlılık .

Bir uygulama oluşturduğunuzda Maven, yerel depodaki bağımlılıkları arar . Orada kararlı bir sürüm bulunmazsa, bu bağımlılığı almak için uzak depolarda ( settings.xmlveya içinde tanımlanmış pom.xml) arama yapar. Ardından, sonraki derlemeler için kullanılabilir hale getirmek için yerel depoya kopyalar.

Örneğin, bir foo-1.0.jarkütüphane kararlı bir sürüm olarak kabul edilir ve Maven yerel depoda bulursa, bunu mevcut derleme için kullanır.

Şimdi, bir foo-1.0-SNAPSHOT.jarkütüphaneye ihtiyacınız varsa , Maven bu sürümün kararlı olmadığını ve değişikliklere tabi olduğunu bilecektir. Bu nedenle Maven, yerel kütüphanede bu kütüphanenin bir sürümü bulunsa bile, uzak depolarda daha yeni bir sürüm bulmaya çalışacaktır. Ancak, bu kontrol günde sadece bir kez yapılır. Bunun anlamı varsa bir o foo-1.0-20110506.110000-1.jartekrar aynı gün Maven yapı çalıştırırsanız yerel depoda (yani bu kütüphane 11:00:00 de 2011/05/06 oluşturulduğunu tespit etti) ve, Maven'in olacak değil depoları kontrol daha yeni bir sürüm için.

Maven, depo tanımınızda bu güncelleme politikasını değiştirmenin bir yolunu sunar:

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

nerede XXXolabilir:

  • her zaman : Maven her derlemede daha yeni bir sürüm olup olmadığını kontrol edecektir;
  • günlük , varsayılan değer;
  • süresi: XXX : dakika cinsinden aralık (XXX)
  • asla : Maven asla başka bir sürüm almaya çalışmaz. Bunu sadece yerel olarak mevcut değilse yapacaktır. Yapılandırma ile SNAPSHOTsürüm kararlı kütüphaneler olarak ele alınacaktır.

(settings.xml modelini burada bulabilirsiniz)


2
O bütün yeniden indirmek Maven'in kuvvete komut satırı anahtarını kullanmak mümkündür görünüyor SNAPSHOTsürümleri: mvn clean package -Uolarak başına maven öğretici
Dimitry K

3
-UBayrağa dikkat edin . MNG-4142 nedeniyle beklediğiniz şeyi yapmayabilir .
Kevin Cross

3
Ayrıca, iyi bir uygulamanın, bir yayın sürümü oluşturmaya geldiğinizde anlık görüntü bağımlılığı kullanmamanızı gerektirdiğinden bahsetmeye değer ve gerçekten de anlık görüntü bağımlılıkları varsa Maven Sürüm Eklentisi başarısız olacaktır.
RCross

2
Koştum mvn install benim yerel repo içine sürüm 1.0-SNAPSHOT bir kavanoz yükleyin. Ertesi gün projede değişiklikler yaptım ama sürümü değiştirmedim - o zaman çalıştırırken mvn installyerel repoda değişmedi. Bu beklenen davranış mı? Bir sürümü yeniden kullanamaz ve üzerinde mvn installdeğişiklik yaptıktan sonra üzerine yazamaz mıyım?
Don Cheadle

1
@mmcrae AFAIK güncellenmelidir. Thats ne yüklemek golü yerel ANLıK kavanoz güncelleyerek, yok. Başka bir şey keşfettiniz mi?
Johnny

73

"SNAPSHOT" terimi, derlemenin belirli bir zamanda kodunuzun bir anlık görüntüsü olduğu anlamına gelir.

Genellikle bu sürümün hala ağır bir geliştirme aşamasında olduğu anlamına gelir.

Kod hazır olduğunda ve serbest bırakılma zamanı geldiğinde, POM'da listelenen sürümü değiştirmek isteyeceksiniz. Sonra "SNAPSHOT" yerine "1.0" gibi bir etiket kullanırsınız.

Sürüm oluşturma konusunda yardım için, Sürüm oluşturma Semantik Sürüm Oluşturma spesifikasyonuna bakın .


Anlamsal sürümleme açısından , bir -SNAPSHOT sürümü bir ön sürüm olacaktır: " Ön sürüm, sürümün kararsız olduğunu ve ilişkili normal sürümü ile belirtilen uyumluluk gereksinimlerini karşılamayabileceğini gösterir. Örnekler: 1.0.0 -alfa, 1.0.0-alfa.1, 1.0.0-0.3.7, 1.0.0-x.7.z.92. "
avandeursen

3
Bana "SNAPSHOT" belirli bir zamanda kodunuzun bir anlık görüntüsü değil, "mevcut kodun en son derlemesi" gibi geliyor. Bu HTTP olsaydı, "HEAD yapmakla uğraşmayın, yine de sunucuda ne varsa alın" yazan bayrak olurdu. Gerçekten de, “belirli bir zamanda kodun” tam tersi.
lilbyrdie

"Ağır" gelişme nedir?
Joker

1
@Joker "heavy" çok şey değiştiğinde (yeni özellikler, yeniden düzenleme vb.)
robert

28

Bir "sürüm" değişmeyen bir sürümün son derlemesidir.

"Anlık görüntü", aynı ada sahip başka bir yapı ile değiştirilebilen bir yapıdır. Bu, yapının herhangi bir zamanda değişebileceğini ve hala aktif geliştirme aşamasında olduğunu ima ediyor.

Aynı koda dayalı olarak farklı sürümler için farklı yapılarınız var. Örneğin bir hata ayıklama ve bir hata ayıklama olabilir. Biri Java 5.0 ve diğeri Java 6 için. Genel olarak ihtiyacınız olan her şeyi yapan bir yapıya sahip olmak daha kolaydır. ;)


21

Maven sürümleri, bir projenin şu anda aktif geliştirme aşamasında olduğunu belirtmek için bir dizgi değişmezi "SNAPSHOT" içerebilir.

Örneğin, projenizde “1.0-SNAPSHOT” sürümü varsa ve bu projenin yapılarını bir Maven deposuna dağıtırsanız, 11'de bir sürüm dağıtacak olsaydınız Maven bu sürümü “1.0-20080207-230803-1” e genişletirdi : 07 Şubat 2008 UTC. Başka bir deyişle, bir anlık görüntüyü dağıtırken, bir yazılım bileşeninin sürümünü yayınlamazsınız; belirli bir zamanda bir bileşenin anlık görüntüsünü serbest bırakıyorsunuzdur.

Bu nedenle, esasen anlık görüntü versiyonları, aktif geliştirme altındaki projeler için kullanılır. Projeniz etkin geliştirilmekte olan bir yazılım bileşenine bağlıysa, anlık görüntü sürümüne güvenebilirsiniz ve Maven, bir derleme çalıştırdığınızda düzenli olarak en son anlık görüntüyü bir depodan indirmeye çalışır. Benzer şekilde, sisteminizin bir sonraki sürümünde “1.8” sürümü olacaksa, projeniz resmi olarak piyasaya sürülene kadar “1.8-SNAPSHOT” sürümüne sahip olacaktır.

Örneğin, aşağıdaki bağımlılık her zaman baharın en son 1.8 geliştirme JAR'ını indirir:

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

Uzman

Maaven salım sürecine bir örnek

resim açıklamasını buraya girin


6

Terminoloji hakkında bir noktaya değinmek istiyorum. Diğer cevaplar Maven bağlamında "enstantane" versiyonun ne olduğu hakkında iyi açıklamalar verdi. Ancak, anlık görüntü olmayan bir sürümün "sürüm" olarak adlandırılması gerektiği anlaşılıyor mu?

Gibi bir eleme olmayan herhangi bir sürümü olacak gibi görünüyor bir "serbest bırakma" versiyonunun anlamsal sürüm fikri arasında bazı gerginlik var -SNAPSHOTön eleme gibi yok da ama -beta.4; ve Maven'in sadece yokluğunu içeren bir "sürüm" versiyonu fikri -SNAPSHOT.

Başka bir deyişle, "sürümün" "Maven Central'a serbest bırakabileceğimiz" veya "yazılımın halka son sürümde olduğu" anlamında anlamsal bir belirsizlik vardır. -beta.4Eğer herkese açık bırakırsak bir "sürüm" olarak düşünebiliriz , ancak bu bir "son sürüm" değildir. Semantik versiyonlama, açık -beta.4bir şekilde "yayın öncesi" bir versiyon olduğunu açıkça belirtmektedir , bu yüzden onsuz bir "yayın" versiyonu olarak adlandırılması mantıklı olmaz -SNAPSHOT. Aslında tanım gereği , test için halkın erişimine izin verebilmemize rağmen, gerçek bir sürüm değil -rc.5, bir sürüm adayıdır .

Maven, buna rağmen, bence sadece niteleyici olmayan bir "sürüm" sürümünü çağırmak daha uygun görünüyor, hatta değil -beta.4. Belki de Maven anlık görüntü olmayan sürümü için daha iyi bir isim "kararlı" bir sürümdür ( başka bir cevaptan esinlenilmiştir ). Böylece:

  • 1.2.3-beta.4-SNAPSHOT: Ön sürümün anlık görüntüsü.
  • 1.2.3-SNAPSHOT: Sürüm sürümünün anlık görüntüsü.
  • 1.2.3-beta.4: Sürüm öncesi sürümün kararlı bir sürümü.
  • 1.2.3: Bir yayın sürümü (açık, sabit, anlık olmayan bir sürümdür).

Maven, meta verileri oluşturma veya yayın öncesi adlandırma kurallarıyla nasıl başa çıktığı hakkında herhangi bir bilginiz var mı? Yani, hepimiz alfa'nın betadan önce geldiğini biliyoruz, ama maven biliyor mu? Kararlı bir sürüm olarak 1.2.3-beta.4 alsa bile, en azından 1.2.3'ün SONRA olduğunu biliyor mu?
DGoiko

5

Anlık görüntü bir havuz için böyle görünür ve bu durumda etkinleştirilmez, yani burada belirtilen havuz sabittir ve güncellemeye gerek yoktur.

<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>

Başka bir durum şöyle olabilir:

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

yani Maven bu depo için güncellemeler arayacaktır. Ayrıca etiketli güncellemeler için bir aralık belirleyebilirsiniz.


5

genellikle maven'de iki tür derleme vardır 1) Anlık görüntü derlemeleri 2) Sürüm derlemeleri

  1. Anlık görüntü derlemeleri: SNAPSHOT, geçerli dağıtım kopyasını normal bir sürüm gibi göstermeyen özel bir sürümdür, maven, uzak havuzdaki her derlemenin sürümünü denetler, böylece anlık görüntü derlemeleri geliştirme derlemelerinden başka bir şey değildir.

  2. Sürüm yapıları: Sürüm, sürüm için SNAPSHOT'un kaldırılması anlamına gelir; bunlar normal sürümlerdir.


3

Anlık görüntü, kararlı olmayan sürüm olduğu anlamına gelir.

sürüm 1.0.0 gibi bir anlık görüntü içerdiğinde -SNAPSHOT kararlı bir sürüm olmadığı anlamına gelir ve bağımlılıkları çözmek için uzak depo arayın


1

SDLC'nin bağlamını anlamak, enstantane ve sürüm arasındaki farkın anlaşılmasına yardımcı olacaktır. Geliştirme işlemi sırasında geliştiricilerin tümü bir temel şubeye özelliklerini katkıda bulunur. Bir noktada, kurşun yeterli özelliklerin biriktiğini düşünür ve ardından taban dalından bir serbest bırakma dalı keser. Bu zaman noktasından önceki tüm yapılar anlık görüntüdür. Bu noktaya gönderi yapan derlemeler bültenlerdir. Unutulmamalıdır ki, salım testleri, salım testi sırasında herhangi bir kusur tespit edilirse üretime gitmeden önce de değişebilir.


1

Anlık görüntü, yapılandırmanıza bağlı olarak Maven'in özel bir bağımlılıktaki en son değişiklikleri kontrol edeceği anlamına gelir. Anlık görüntü kararsızdır, çünkü geliştirme aşamasındadır, ancak özel bir projede en son değişikliklerin yapılması gerekiyorsa bağımlılık sürümünüzü anlık görüntü sürümüne yapılandırmanız gerekir. Bu senaryo, bu ürünlerin birbiriyle yakından ilişkili olduğu birden fazla ürüne sahip büyük kuruluşlarda meydana gelir.


0

Adından da anlaşılacağı gibi, anlık görüntü projenin durumunu ve o andaki bağımlılıklarını ifade eder. Maven projenin daha yeni bir SNAPSHOT'unu bulduğunda, yerel depodaki projenin eski .jar dosyasını indirir ve değiştirir.

Anlık görüntü sürümleri, aktif geliştirme altındaki projeler için kullanılır. Projeniz etkin geliştirilmekte olan bir yazılım bileşenine bağlıysa, anlık görüntü sürümüne güvenebilirsiniz ve Maven, bir derleme çalıştırdığınızda düzenli olarak en son anlık görüntüyü bir depodan indirmeye çalışır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.