Що саме є знімок Maven і навіщо він нам потрібен?


Відповіді:


1013

Версія для знімків у Maven - це та, яка не вийшла.

Ідея полягає в тому , що перед1.0 тим реліз (або будь-який інший реліз) робиться, існує 1.0-SNAPSHOT. Ця версія може стати тим, що може стати1.0 . Це в основному "в 1.0стадії розробки". Це може бути близьким до реального 1.0випуску, або досить далеко (наприклад, після 0.9випуску, наприклад).

Різниця між "реальною" версією та версією знімка полягає в тому, що знімки можуть отримувати оновлення. Це означає, що завантаження 1.0-SNAPSHOTсьогодні може дати файл, відмінний від завантаження вчора чи завтра.

Зазвичай залежність знімків повинна існувати лише під час розробки, і жодна випущена версія (тобто не знімка) не повинна залежати від версії знімка.


67
@amphibient: Ні, знімок не обов'язково є більш стабільним: це лише остання збірка. Знімок передує фактичному випуску, після нього він не настає. Дійсно, номери версій зазвичай не стосуються гілок.
avandeursen

9
Знімки @avandeursen не обов'язково мають семантику, на яку ви заявляєте. Ви можете мати "master-SNAPSHOT" та пізніше зробити випуск 1.0. це не повинно бути "FutureVersion-SNAPSHOT", ні обов'язково коли-небудь передувати релізу. Хоча все інше вірно - це нестабільне посилання на рухому ціль і на неї не можна покластися, щоб створити повторювану збірку.
Скотт Кері

3
Дякую @ScottCarey "Звичайне передує", ймовірно, справді було б більш точним, оскільки немає навіть гарантії того, що "рухома мета" з часом буде існувати.
avandeursen

1
@Jay: ні, наскільки я знаю, немає ніякого способу явного посилання на певний SNAPSHOT, вони не адресовані / взаємозамінні за конструкцією. Якщо вам потрібна дрібнозерниста версія, тоді вам слід просто випустити кандидатів до випуску з певними рядками версії (-RC1, -RC2 або щось подібне).
Йоахім Зауер

14
Чому вони не можуть просто назвати це " 1.0-DEVELOPMENT", або як " 1.0-INPROGRESS", чому людям доводиться використовувати не очевидні терміни
uh_big_mike_boi

791

Три інші відповіді дають вам хороше бачення того, що таке -SNAPSHOTверсія. Я просто хотів додати трохи інформації стосовно поведінки Мейвена, коли вона виявляєSNAPSHOT залежність.

Коли ви створюєте додаток, Maven шукатиме залежності в локальному сховищі. Якщо там не знайдено стабільної версії, вона здійснить пошук у віддалених сховищах (визначених у settings.xmlабо pom.xml), щоб отримати цю залежність. Потім він скопіює його в локальний сховище, щоб зробити його доступним для наступних збірок.

Наприклад, foo-1.0.jarбібліотека розглядається як стабільна версія, і якщо Maven знайде її у локальному сховищі, вона використає цю для поточної збірки.

Тепер, якщо вам потрібна foo-1.0-SNAPSHOT.jarбібліотека, Мейвен буде знати, що ця версія не є стабільною і підлягає змінам. Ось чому Maven спробує знайти нову версію у віддалених сховищах, навіть якщо версія цієї бібліотеки буде знайдена в локальному сховищі. Однак ця перевірка робиться лише один раз на день. Це означає, що якщо у вас є foo-1.0-20110506.110000-1.jar(тобто ця бібліотека була створена 2011/05/06 о 11:00:00) у вашому локальному сховищі, і якщо ви знову запустите збірку Maven того ж дня, Maven не перевірить сховища для нової версії.

Maven пропонує вам спосіб змінити цю політику оновлення у визначенні вашого сховища:

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

де XXXможна:

  • завжди : Maven перевірятиме на новіші версії для кожної збірки;
  • щоденне значення за замовчуванням;
  • інтервал: XXX : інтервал у хвилинах (XXX)
  • ніколи : Maven ніколи не намагатиметься отримати іншу версію. Це буде зроблено лише в тому випадку, якщо він не існує локально. При конфігурації SNAPSHOTверсія буде оброблятися як стабільна бібліотека.

(модель налаштування.xml можна знайти тут)


2
Здається, можна використовувати перемикач командного рядка, щоб змусити Maven перезавантажити всі SNAPSHOTверсії: mvn clean package -Uвідповідно до підручника Maven
Dimitry K

3
Обережно з -Uпрапором. Це може не виконати те, що ви очікуєте, завдяки MNG-4142 .
Кевін Крос

3
Також варто відзначити, що хороша практика вимагає не використовувати залежностей від знімків, коли ви збираєтесь створити версію випуску, і дійсно плагін Maven Release не вдасться, якщо існують залежності знімків.
RCross

2
Я побіг mvn installвстановити банку моєї версії 1.0-SNAPSHOT у своє місцеве репо. Наступного дня я вніс зміни в проект, але не змінив версію - тоді при запуску mvn installне здавалося, що це змінило в моєму місцевому репо. Це очікувана поведінка? Чи не можу я повторно використовувати версію та замінити її mvn installпісля внесення змін до неї?
Don Cheadle

1
@mmcrae AFAIK його слід оновити. Ось що і роблять цілі встановлення , оновлення місцевих банок SNAPSHOT. Ви щось відкрили?
Джонні

73

Термін "SNAPSHOT" означає, що збірка - це знімок вашого коду в даний момент часу.

Зазвичай це означає, що ця версія все ще знаходиться в значній розробці.

Коли код буде готовий і прийшов час його випустити, ви захочете змінити версію, перелічену в POM. Тоді замість "SNAPSHOT" ви б використовували мітку типу "1.0".

Щоб отримати допомогу щодо версій, перегляньте специфікацію Semantic Versioning .


З точки зору семантичної версії , випуск -SNAPSHOT буде попереднім випуском: " Версія перед випуском вказує на те, що версія є нестабільною та може не задовольняти передбаченим вимогам сумісності, як позначається відповідною відповідною звичайною версією. Приклади: 1.0.0 -alpha, 1.0.0-alpha.1, 1.0.0-0.3.7, 1.0.0-x.7.z.92. "
avandeursen

3
Мені здається, що "SNAPSHOT" - це не "знімок вашого коду в певний час", а "найсвіжіша версія наявного коду". Якби це HTTP, це був би прапор, який говорить: "Не турбуйтеся робити HEAD, будь-ласка, дістаньте все, що є на сервері". Дійсно, це майже протилежний "код в даний момент часу".
lilbyrdie

Що таке "важкий" розвиток?
Джокер

1
@Joker "важкий", коли багато чого змінюється (нові функції, рефакторинг тощо)
Роберт

28

"Випуск" - це остаточна збірка для версії, яка не змінюється.

"Знімок" - це збірка, яку можна замінити іншою збіркою з такою ж назвою. Це означає, що збірка може змінитися в будь-який час і все ще знаходиться в активному розвитку.

У вас є різні артефакти для різних збірок на основі одного і того ж коду. Наприклад, у вас може бути одна з налагодженням і одна без. Один для Java 5.0 і один для Java 6. Як правило, простішою є одна збірка, яка виконує все необхідне. ;)


21

Версії Maven можуть містити буквальний рядок "SNAPSHOT", що означає, що проект наразі знаходиться в активній розробці.

Наприклад, якщо ваш проект має версію "1.0-SNAPSHOT" і ви розгортаєте артефакти цього проекту до сховища Maven, Maven розширить цю версію до "1.0-20080207-230803-1", якби ви розгорнули випуск у 11 : 8 лютого 7 лютого 2008 року UTC. Іншими словами, коли ви розгортаєте знімок, ви не здійснюєте випуск програмного компонента; ви випускаєте знімок компонента в певний час.

Тому в основному версії знімків використовуються для проектів, що перебувають у стадії активного розвитку. Якщо ваш проект залежить від програмного компонента, який знаходиться в стадії активного розвитку, ви можете залежати від випуску знімка, і Maven періодично намагатиметься завантажити останній знімок із сховища під час запуску збірки. Аналогічно, якщо наступний реліз вашої системи матиме версію "1.8", ваш проект матиме версію "1.8-SNAPSHOT" до офіційного випуску.

Наприклад, наступна залежність завжди буде завантажувати останню версію 1.8 JAR весни:

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

Мейвен

Приклад процесу випуску Maven

введіть тут опис зображення


6

Я хотів би зауважити термінологію. Інші відповіді дали хороші пояснення щодо того, що таке "знімок" версії в контексті Мейвена. Але звідси випливає, що версію, яка не знімається, слід називати версією "реліз"?

Існує деяка напруженість між ідеєю семантичної версії "релізної" версії, яка, здавалося б, була будь-якою версією, яка не має такого кваліфікувача, як, -SNAPSHOTале також не має такого кваліфікатора, як -beta.4; і ідея ідеї Мейвена про "випуску" версії, яка, здається, включає лише відсутність -SNAPSHOT.

Іншими словами, існує семантична неоднозначність того, чи означає "випуск" "ми можемо випустити його в Maven Central" або "програмне забезпечення знаходиться в остаточному випуску для громадськості". Ми можемо вважати -beta.4версію "випуску", якщо випустимо її для публіки, але це не "остаточний реліз". Семантичні версії чітко говорять про те, що щось на кшталт -beta.4є "попередньою" версією, тому не було б сенсу називати її "релізною" версією навіть без неї -SNAPSHOT. Насправді за визначенням навіть -rc.5є кандидатом на реліз , а не фактичним випуском, хоча ми можемо дозволити доступ громадськості для тестування.

Незважаючи на це, Мейвен, на мою думку, видається більш доцільним лише називати "релізну" версію, у якої взагалі немає жодного кваліфікувача, навіть -beta.4. Можливо, кращою назвою для невідової версії Maven була б "стабільна" версія (натхненна іншою відповіддю ). Таким чином, ми мали б:

  • 1.2.3-beta.4-SNAPSHOT: Знімок попередньої версії.
  • 1.2.3-SNAPSHOT: Знімок версії версії.
  • 1.2.3-beta.4: Стабільна версія попередньої версії.
  • 1.2.3: Версія випуску (очевидно, що це стабільна версія, яка не є знімком).

Чи маєте ви якусь інформацію про те, як maven поводиться зі збиранням метаданих або умовами попереднього випуску імен? Я маю на увазі, ми всі знаємо, що альфа передує бета, але хіба Мейвен знає? Навіть якщо він приймає 1.2.3-бета.4 як стабільний випуск, чи принаймні він знає, що 1.2.3 ПІСЛЯ цього?
DGoiko

5

Ось так виглядає знімок сховища, і в цьому випадку він не ввімкнено, а це означає, що сховане сховище тут стабільне і немає необхідності в оновленнях.

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

Ще один випадок:

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

що означає, що Maven буде шукати оновлення для цього сховища. Ви також можете вказати інтервал для оновлень з тегом.


5

зазвичай у Maven у нас є два типи складання 1) Знімок знімків 2) Випуск складання

  1. Зробити знімок: SNAPSHOT - це спеціальна версія, яка вказує на те, що поточна копія розгортання не схожа на звичайну версію, maven перевіряє версію для кожної збірки у віддаленому сховищі, тому знімки на знімку - це не що інше, як розвиток.

  2. Створення версій: випуск означає видалення SNAPSHOT у версії для збірки, це звичайні версії збірки.


3

просто знімок означає, що це версія, яка не є стабільною.

коли версія включає знімок на зразок 1.0.0 -SNAPSHOT означає, що це не стабільна версія та шукайте віддалене сховище для вирішення залежностей


1

розуміння контексту SDLC допоможе зрозуміти різницю між знімком та випуском. Під час процесу розробки розробники вносять свої особливості у базову галузь. У якийсь момент ведучий думає, що достатньо функцій накопичилося, тоді він виріже гілку випуску з базової гілки. Будь-які побудови до цього моменту часу - це знімки. Повідомлення будуються до цього моменту - це випуски. Зауважте, версії версій можуть також змінитися перед початком виробництва, якщо під час тестування на випуск з'явиться дефект.


1

Знімок просто означає, що залежно від конфігурації Maven перевірятиме останні зміни на спеціальній залежності. Знімок нестабільний, тому що він перебуває в стадії розробки, але якщо для спеціального проекту потрібно внести останні зміни, потрібно налаштувати свою залежну версію на версію знімка. Цей сценарій трапляється у великих організаціях із безліччю продуктів, які ці товари дуже пов’язані між собою.


0

Як випливає з назви, знімок стосується стану проекту та його залежностей на той момент часу. Щоразу, коли Maven знайде новіший SNAPSHOT проекту, він завантажує та замінює старіший .jar файл проекту у локальному сховищі.

Версії Snapshot використовуються для проектів, що активно розробляються. Якщо ваш проект залежить від програмного компонента, який знаходиться в стадії активного розвитку, ви можете залежати від випуску знімка, і Maven періодично намагатиметься завантажити останній знімок із сховища під час запуску збірки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.