Відповіді:
Версія для знімків у Maven - це та, яка не вийшла.
Ідея полягає в тому , що перед1.0
тим реліз (або будь-який інший реліз) робиться, існує 1.0-SNAPSHOT
. Ця версія може стати тим, що може стати1.0
. Це в основному "в 1.0
стадії розробки". Це може бути близьким до реального 1.0
випуску, або досить далеко (наприклад, після 0.9
випуску, наприклад).
Різниця між "реальною" версією та версією знімка полягає в тому, що знімки можуть отримувати оновлення. Це означає, що завантаження 1.0-SNAPSHOT
сьогодні може дати файл, відмінний від завантаження вчора чи завтра.
Зазвичай залежність знімків повинна існувати лише під час розробки, і жодна випущена версія (тобто не знімка) не повинна залежати від версії знімка.
1.0-DEVELOPMENT
", або як " 1.0-INPROGRESS
", чому людям доводиться використовувати не очевидні терміни
Три інші відповіді дають вам хороше бачення того, що таке -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
можна:
SNAPSHOT
версія буде оброблятися як стабільна бібліотека.(модель налаштування.xml можна знайти тут)
SNAPSHOT
версії: mvn clean package -U
відповідно до підручника Maven
-U
прапором. Це може не виконати те, що ви очікуєте, завдяки MNG-4142 .
mvn install
встановити банку моєї версії 1.0-SNAPSHOT у своє місцеве репо. Наступного дня я вніс зміни в проект, але не змінив версію - тоді при запуску mvn install
не здавалося, що це змінило в моєму місцевому репо. Це очікувана поведінка? Чи не можу я повторно використовувати версію та замінити її mvn install
після внесення змін до неї?
Термін "SNAPSHOT" означає, що збірка - це знімок вашого коду в даний момент часу.
Зазвичай це означає, що ця версія все ще знаходиться в значній розробці.
Коли код буде готовий і прийшов час його випустити, ви захочете змінити версію, перелічену в POM. Тоді замість "SNAPSHOT" ви б використовували мітку типу "1.0".
Щоб отримати допомогу щодо версій, перегляньте специфікацію Semantic Versioning .
"Випуск" - це остаточна збірка для версії, яка не змінюється.
"Знімок" - це збірка, яку можна замінити іншою збіркою з такою ж назвою. Це означає, що збірка може змінитися в будь-який час і все ще знаходиться в активному розвитку.
У вас є різні артефакти для різних збірок на основі одного і того ж коду. Наприклад, у вас може бути одна з налагодженням і одна без. Один для Java 5.0 і один для Java 6. Як правило, простішою є одна збірка, яка виконує все необхідне. ;)
Версії 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
Я хотів би зауважити термінологію. Інші відповіді дали хороші пояснення щодо того, що таке "знімок" версії в контексті Мейвена. Але звідси випливає, що версію, яка не знімається, слід називати версією "реліз"?
Існує деяка напруженість між ідеєю семантичної версії "релізної" версії, яка, здавалося б, була будь-якою версією, яка не має такого кваліфікувача, як, -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
: Версія випуску (очевидно, що це стабільна версія, яка не є знімком).Ось так виглядає знімок сховища, і в цьому випадку він не ввімкнено, а це означає, що сховане сховище тут стабільне і немає необхідності в оновленнях.
<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 буде шукати оновлення для цього сховища. Ви також можете вказати інтервал для оновлень з тегом.
зазвичай у Maven у нас є два типи складання 1) Знімок знімків 2) Випуск складання
Зробити знімок: SNAPSHOT - це спеціальна версія, яка вказує на те, що поточна копія розгортання не схожа на звичайну версію, maven перевіряє версію для кожної збірки у віддаленому сховищі, тому знімки на знімку - це не що інше, як розвиток.
Створення версій: випуск означає видалення SNAPSHOT у версії для збірки, це звичайні версії збірки.
просто знімок означає, що це версія, яка не є стабільною.
коли версія включає знімок на зразок 1.0.0 -SNAPSHOT означає, що це не стабільна версія та шукайте віддалене сховище для вирішення залежностей
розуміння контексту SDLC допоможе зрозуміти різницю між знімком та випуском. Під час процесу розробки розробники вносять свої особливості у базову галузь. У якийсь момент ведучий думає, що достатньо функцій накопичилося, тоді він виріже гілку випуску з базової гілки. Будь-які побудови до цього моменту часу - це знімки. Повідомлення будуються до цього моменту - це випуски. Зауважте, версії версій можуть також змінитися перед початком виробництва, якщо під час тестування на випуск з'явиться дефект.
Знімок просто означає, що залежно від конфігурації Maven перевірятиме останні зміни на спеціальній залежності. Знімок нестабільний, тому що він перебуває в стадії розробки, але якщо для спеціального проекту потрібно внести останні зміни, потрібно налаштувати свою залежну версію на версію знімка. Цей сценарій трапляється у великих організаціях із безліччю продуктів, які ці товари дуже пов’язані між собою.
Як випливає з назви, знімок стосується стану проекту та його залежностей на той момент часу. Щоразу, коли Maven знайде новіший SNAPSHOT проекту, він завантажує та замінює старіший .jar файл проекту у локальному сховищі.
Версії Snapshot використовуються для проектів, що активно розробляються. Якщо ваш проект залежить від програмного компонента, який знаходиться в стадії активного розвитку, ви можете залежати від випуску знімка, і Maven періодично намагатиметься завантажити останній знімок із сховища під час запуску збірки.