Czym dokładnie jest migawka Maven i dlaczego jej potrzebujemy?

Odpowiedzi:

1013

Wersja migawki w Maven to taka, która nie została wydana.

Chodzi o to, że przed1.0 uwalnianiu (lub dowolny inny release) jest zrobione, istnieje 1.0-SNAPSHOT. Ta wersja może się stać 1.0 . Zasadniczo jest „w 1.0fazie rozwoju”. Może to być zbliżone do prawdziwego 1.0wydania lub dość daleko ( 0.9na przykład tuż po wydaniu).

Różnica między wersją „rzeczywistą” a wersją migawkową polega na tym, że migawki mogą otrzymywać aktualizacje. Oznacza to, że pobieranie 1.0-SNAPSHOTdzisiaj może dać inny plik niż pobieranie go wczoraj lub jutro.

Zwykle zależności migawki powinny istnieć tylko podczas programowania i żadna wydana wersja (tj. Brak wersji innej niż migawka) nie powinna mieć zależności od wersji migawki.

Joachim Sauer
źródło
67
@amphibient: Nie, migawka jest nie koniecznie bardziej stabilny: jest to tylko najnowszy build. Migawka poprzedza faktyczne wydanie, ale nie następuje po nim. Rzeczywiście numery wersji zwykle nie odnoszą się do oddziałów.
avandeursen
9
Migawki @avandeursen niekoniecznie mają semantykę, o którą się twierdzisz. Możesz mieć „master-SNAPSHOT”, a później wydać wersję 1.0. nie musi to być „FutureVersion-SNAPSHOT”, ani niekoniecznie poprzedzać wydania. Wszystko inne ma rację - jest to niestabilne odniesienie do poruszającego się celu i nie można na nim polegać, aby uzyskać powtarzalną kompilację.
Scott Carey
3
Dzięki @ScottCarey. „Zwykle poprzedza” byłoby prawdopodobnie dokładniejsze, ponieważ nie ma nawet gwarancji, że „ruchomy cel” w końcu będzie istniał.
avandeursen
1
@Jay: nie, o ile wiem, nie ma sposobu na wyraźne odniesienie do konkretnego SNAPSHOT, nie są one adresowalne / wymienne z założenia. Jeśli potrzebujesz drobnoziarnistej wersji, powinieneś po prostu zwolnić kandydatów do wydania z określonymi ciągami wersji (-RC1, -RC2 lub coś w tym rodzaju).
Joachim Sauer,
14
Dlaczego nie mogą po prostu nazwać tego „ 1.0-DEVELOPMENT” lub polubić „ 1.0-INPROGRESS”, dlaczego ludzie muszą używać nieoczywistych terminów
uh_big_mike_boi
791

Trzy pozostałe odpowiedzi zapewniają dobrą wizję -SNAPSHOTwersji. Chciałem tylko dodać trochę informacji dotyczących zachowania Maven, gdy znajdzie SNAPSHOTzależność.

Podczas budowania aplikacji Maven wyszuka zależności w lokalnym repozytorium. Jeśli nie zostanie tam znaleziona stabilna wersja, przeszuka ona zdalne repozytoria (zdefiniowane w settings.xmllub pom.xml), aby pobrać tę zależność. Następnie skopiuje go do lokalnego repozytorium, aby udostępnić go dla następnych kompilacji.

Na przykład, foo-1.0.jarbiblioteka jest uważana za wersję stabilną , a jeśli Maven znajdzie ją w lokalnym repozytorium, wykorzysta ją do bieżącej kompilacji.

Teraz, jeśli potrzebujesz foo-1.0-SNAPSHOT.jarbiblioteki, Maven będzie wiedział, że ta wersja nie jest stabilna i może ulec zmianie. Właśnie dlatego Maven spróbuje znaleźć nowszą wersję w zdalnych repozytoriach, nawet jeśli wersja tej biblioteki zostanie znaleziona w lokalnym repozytorium. Jednak ta kontrola jest przeprowadzana tylko raz dziennie. Oznacza to, że jeśli masz foo-1.0-20110506.110000-1.jar(tj. Ta biblioteka została wygenerowana 2011/05/06 o 11:00:00) w swoim lokalnym repozytorium, a jeśli uruchomisz kompilację Maven ponownie tego samego dnia, Maven nie sprawdzi repozytoriów dla nowszej wersji.

Maven umożliwia zmianę tej zasady aktualizacji w definicji repozytorium:

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

gdzie XXXmoże być:

  • zawsze : Maven będzie sprawdzać dostępność nowszej wersji dla każdej wersji;
  • codziennie wartość domyślna;
  • interwał: XXX : interwał w minutach (XXX)
  • never : Maven nigdy nie będzie próbował pobrać innej wersji. Zrobi to tylko wtedy, gdy nie istnieje lokalnie. Przy konfiguracji SNAPSHOTwersja będzie obsługiwana jako biblioteki stabilne.

(model pliku settings.xml można znaleźć tutaj)

Romain Linsolas
źródło
2
Wydaje się, że można użyć przełącznika wiersza polecenia, aby zmusić maven do ponownego pobrania wszystkich SNAPSHOTwersji: mvn clean package -Uzgodnie z samouczkiem maven
Dimitry K
3
Ostrożnie z -Uflagą. Może nie działać zgodnie z oczekiwaniami z powodu MNG-4142 .
Kevin Cross
3
Warto również wspomnieć, że dobra praktyka wymaga, aby nie używać zależności migawek podczas tworzenia wersji wersji, a rzeczywiście Maven Release Plugin nie powiedzie się, jeśli pojawią się zależności migawki.
RCross
2
Pobiegłem mvn installzainstalować słoik wersji 1.0-SNAPSHOT na moim lokalnym repozytorium. Następnego dnia wprowadziłem zmiany w projekcie, ale nie zmieniłem wersji - wtedy, gdy działałem mvn install, nie wydawało się, że zmienia to w moim lokalnym repozytorium. Czy to oczekiwane zachowanie? Czy nie mogę ponownie użyć wersji i zastąpić ją mvn installpo wprowadzeniu zmian?
Don Cheadle
1
@mmcrae AFAIK należy zaktualizować. To właśnie robi cel instalacji , aktualizując lokalne słoiki SNAPSHOT. Czy odkryłeś coś jeszcze?
Johnny
73

Termin „SNAPSHOT” oznacza, że ​​kompilacja jest migawką twojego kodu w danym momencie.

Zazwyczaj oznacza to, że ta wersja jest wciąż intensywnie rozwijana.

Kiedy kod będzie gotowy i nadszedł czas na jego opublikowanie, będziesz chciał zmienić wersję wymienioną w POM. Następnie zamiast „SNAPSHOT” użyłbyś etykiety takiej jak „1.0”.

Aby uzyskać pomoc dotyczącą wersjonowania, zapoznaj się ze specyfikacją wersjonowania semantycznego .

jjnguy
źródło
Pod względem wersji semantycznej wersja -SNAPSHOT byłaby wersją przedpremierową: „ Wersja przedpremierowa wskazuje, że wersja jest niestabilna i może nie spełniać zamierzonych wymagań kompatybilności, jak wskazano w powiązanej z nią normalnej wersji. Przykłady: 1.0.0 -alfa, 1.0.0-alpha.1, 1.0.0-0.3.7, 1.0.0-x.7.z.92. "
avandeursen
3
Wydaje mi się, że „SNAPSHOT” nie jest „migawką twojego kodu w określonym czasie”, ale „najnowszą dostępną wersją kodu”. Gdyby to był HTTP, oznaczałoby to flagę: „Nie przejmuj się robieniem HEAD, idź i tak weź wszystko, co jest na serwerze”. Rzeczywiście, jest to prawie przeciwny „kod w danym momencie”.
lilbyrdie
Co to jest „ciężki” rozwój?
Joker
1
@Joker „ciężki” ma miejsce, gdy wiele rzeczy się zmienia (nowe funkcje, refaktoryzacja itp.)
Robert
28

„Wydanie” to ostateczna wersja dla wersji, która się nie zmienia.

„Migawka” to kompilacja, którą można zastąpić inną kompilacją o tej samej nazwie. Sugeruje to, że kompilacja może się zmienić w dowolnym momencie i nadal jest aktywnie rozwijana.

Masz różne artefakty dla różnych wersji opartych na tym samym kodzie. Np. Możesz mieć taki z debugowaniem, a drugi bez. Jeden dla Java 5.0 i jeden dla Java 6. Zasadniczo łatwiej jest mieć jedną kompilację, która robi wszystko, czego potrzebujesz. ;)

Peter Lawrey
źródło
21

Wersje Maven mogą zawierać dosłowny ciąg „SNAPSHOT”, co oznacza, że ​​projekt jest aktualnie w fazie rozwoju.

Na przykład, jeśli twój projekt ma wersję „1.0-SNAPSHOT” i wdrożysz artefakty tego projektu w repozytorium Maven, Maven rozszerzy tę wersję do „1.0-20080207-230803-1”, jeśli miałbyś wdrożyć wersję 11 : 20:00 w dniu 7 lutego 2008 r. UTC. Innymi słowy, podczas wdrażania migawki nie tworzysz wydania komponentu oprogramowania; zwalniasz migawkę komponentu w określonym czasie.

Dlatego głównie projekty migawkowe są używane w projektach będących w trakcie aktywnego rozwoju. Jeśli Twój projekt zależy od komponentu oprogramowania, który jest w trakcie opracowywania, możesz polegać na wersji migawki, a Maven będzie okresowo próbować pobrać najnowszą migawkę z repozytorium po uruchomieniu kompilacji. Podobnie, jeśli następne wydanie twojego systemu będzie miało wersję „1.8”, twój projekt będzie miał wersję „1.8-SNAPSHOT”, dopóki nie zostanie oficjalnie wydany.

Na przykład następująca zależność zawsze pobierałaby najnowszą wersję JAR 1.8 wiosny:

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

Maven

Przykład procesu uwalniania maven

wprowadź opis zdjęcia tutaj

Joby Wilson Mathews
źródło
6

Chciałbym zwrócić uwagę na terminologię. Inne odpowiedzi dały dobre wyjaśnienia na temat tego, czym jest wersja „migawka” w kontekście Maven. Ale czy wynika z tego, że wersję inną niż migawka należy nazwać wersją „release”?

Istnieje pewne napięcie między semantyczną wersją wersji „wydania”, która wydaje się być dowolną wersją, która nie ma kwalifikatora, takiego jak, -SNAPSHOTale nie ma takiego kwalifikatora, jak -beta.4; oraz pomysł Mavena na wersję „release”, która wydaje się obejmować tylko brak -SNAPSHOT.

Innymi słowy, istnieje semantyczna dwuznaczność tego, czy „wydanie” oznacza „możemy wydać je do Maven Central”, czy „oprogramowanie jest w ostatecznej wersji do publicznej wiadomości”. Możemy uznać -beta.4za wersję „wydaną”, jeśli udostępnimy ją publicznie, ale nie jest to „wersja ostateczna”. Wersje semantyczne wyraźnie mówią, że coś takiego -beta.4jest wersją „przedpremierową”, więc nie ma sensu nazywanie jej wersją, nawet bez niej -SNAPSHOT. W rzeczywistości z definicji -rc.5jest nawet kandydatem do wydania , a nie faktycznym wydaniem, nawet jeśli możemy pozwolić na publiczny dostęp do testowania.

Niezależnie od tego, Maven, moim zdaniem, bardziej odpowiednie wydaje się nazywanie wersji „release”, która nie ma żadnego kwalifikatora, nawet -beta.4. Być może lepszą nazwą dla wersji innej niż migawka Maven byłaby wersja „stabilna” (zainspirowana inną odpowiedzią ). Zatem mielibyśmy:

  • 1.2.3-beta.4-SNAPSHOT: Wersja migawki wersji przedpremierowej.
  • 1.2.3-SNAPSHOT: Migawka wersji wydania.
  • 1.2.3-beta.4: Stabilna wersja wersji wstępnej.
  • 1.2.3: Wersja wydania (która oczywiście jest stabilną wersją bez migawki).
Garret Wilson
źródło
Czy masz jakieś informacje na temat tego, jak maven radzi sobie z metadanymi kompilacji lub konwencjami nazewnictwa przed wydaniem? To znaczy wszyscy wiemy, że alfa wyprzedza beta, ale czy maven wie? Nawet jeśli przyjmuje wersję 1.2.3-beta.4 jako stabilną wersję, czy przynajmniej wie, że wersja 1.2.3 PO niej jest?
DGoiko
5

Tak wygląda migawka dla repozytorium iw tym przypadku nie jest włączona, co oznacza, że ​​repozytorium, o którym mowa tutaj, jest stabilne i nie ma potrzeby aktualizacji.

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

Kolejny przypadek dotyczyłby:

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

co oznacza, że ​​Maven będzie szukał aktualizacji dla tego repozytorium. Możesz także określić odstęp czasu dla aktualizacji za pomocą znacznika.

Kati Holasz
źródło
5

zwykle w maven mamy dwa typy kompilacji 1) Kompilacje migawek 2) Kompilacje wydań

  1. kompilacje migawek: SNAPSHOT to specjalna wersja, która wskazuje, że bieżąca kopia wdrożeniowa nie jest taka jak zwykła wersja, maven sprawdza wersję dla każdej kompilacji w zdalnym repozytorium, więc kompilacje migawek są jedynie kompilacjami programistycznymi.

  2. Kompilacje wydania: Wydanie oznacza usunięcie SNAPSHOT w wersji kompilacji, są to zwykłe wersje kompilacji.

Venky Vungarala
źródło
3

po prostu migawka oznacza, że ​​jest to wersja niestabilna.

gdy wersja zawiera migawkę jak 1.0.0 -SNAPSHOT oznacza, że ​​nie jest to stabilna wersja i poszukaj zdalnego repozytorium w celu rozwiązania zależności

shanika prasangika
źródło
1

zrozumienie kontekstu SDLC pomoże zrozumieć różnicę między migawką a wydaniem. Podczas procesu projektowania wszyscy programiści wnoszą swoje funkcje do podstawowej gałęzi. W pewnym momencie lider uważa, że ​​zgromadzono wystarczającą liczbę funkcji, a następnie odetnie gałąź wydania z gałęzi linii bazowej. Wszelkie kompilacje sprzed tego punktu czasowego są migawkami. Posty do tego momentu są wydaniami. Należy pamiętać, że kompilacje wersji mogą również ulec zmianie przed przejściem do produkcji, jeśli wystąpi jakaś wada podczas testowania wersji.

CCNA
źródło
1

Migawka oznacza po prostu, w zależności od konfiguracji, Maven sprawdzi najnowsze zmiany w specjalnej zależności. Migawka jest niestabilna, ponieważ jest w trakcie opracowywania, ale jeśli w specjalnym projekcie trzeba wprowadzić najnowsze zmiany, należy skonfigurować wersję zależności do wersji migawki. Ten scenariusz występuje w dużych organizacjach z wieloma produktami, które są ze sobą bardzo blisko powiązane.

Mahdi Soltani
źródło
0

Jak sama nazwa wskazuje, migawka odnosi się do stanu projektu i jego zależności w danym momencie. Ilekroć maven znajdzie nowszą SNAPSHOT projektu, pobiera i zastępuje starszy plik .jar projektu w lokalnym repozytorium.

Wersje migawkowe są używane w projektach w trakcie aktywnego opracowywania. Jeśli Twój projekt zależy od komponentu oprogramowania, który jest w trakcie opracowywania, możesz polegać na wersji migawki, a Maven będzie okresowo próbować pobrać najnowszą migawkę z repozytorium po uruchomieniu kompilacji.

Sourabh Bhavsar
źródło