Я немного смущен о значении моментального снимка Maven и почему мы строим его?
Версия моментального снимка в Maven - это тот, который не был выпущен.
Идея заключается в том, что завершена до версия 1.0
(или любая другая версия), существует 1.0-SNAPSHOT
. Эта версия может стать 1.0
. Это в основном "1.0
в разработке". Это может быть близко к реальной версии 1.0
или довольно далеко (сразу после выпуска 0.9
, например).
Разница между "реальной" версией и версией моментального снимка заключается в том, что моментальные снимки могут получать обновления. Это означает, что загрузка 1.0-SNAPSHOT
сегодня может дать другой файл, чем загрузка его вчера или завтра.
Обычно зависимости от моментального снимка должны быть только во время разработки, и никакая выпущенная версия (т.е. без моментального снимка) должна иметь зависимость от версии моментального снимка.
Три других ответа дают вам хорошее представление о версии -SNAPSHOT
. Я просто хотел добавить некоторую информацию о поведении Maven, когда обнаружил зависимость SNAPSHOT
.
При создании приложения Maven будет искать зависимости в репозитории local. Если стабильная версия там не найдена, она будет искать удаленные репозитории (определенные в settings.xml
или pom.xml
) для получения этой зависимости. Затем он скопирует его в локальный репозиторий, чтобы сделать его доступным для следующих сборок.
Например, библиотека foo-1.0.jar
рассматривается как стабильная версия, и если Maven находит ее в локальном репозитории, она будет использовать ее для текущей сборки.
Теперь, если вам нужна библиотека foo-1.0-SNAPSHOT.jar
, Maven будет знать, что эта версия нестабильна и может быть изменена. Поэтому Maven попытается найти более новую версию в удаленных репозиториях, даже если версия этой библиотеки будет найдена в локальном репозитории. Однако эта проверка выполняется только один раз в день. Это означает, что если у вас есть foo-1.0-20110506.110000-1.jar
(т.е. Эта библиотека была сгенерирована в 2011/05/06 в 11:00:00) в вашем локальном репозитории, и если вы снова запустите сборку Maven в тот же день, Maven будет not проверить репозитории для более новой версии.
Maven предоставляет вам возможность изменить эту политику обновления в определении вашего репозитория:
<repository>
<id>foo-repository</id>
<url>...</url>
<snapshots>
<enabled>true</enabled>
<updatePolicy>XXX</updatePolicy>
</snapshots>
</repository>
где XXX
может быть:
SNAPSHOT
будет обрабатываться как стабильные библиотеки.(здесь можно найти модель settings.xml
SNAPSHOT
: mvn clean package -U
согласно учебному пособию по maven
-U
. Это может не сделать то, что вы ожидаете из-за MNG-4142 .
Термин "SNAPSHOT" означает, что сборка представляет собой снимок вашего кода в данный момент времени.
Обычно это означает, что эта версия все еще находится в стадии разработки.
Когда код будет готов и пришло время его выпустить, вы захотите изменить версию, указанную в POM. Тогда вместо "SNAPSHOT" вы бы использовали метку типа "1.0".
Для некоторой помощи с версионированием проверьте спецификацию Семантического Версионирования.
"release" - это окончательная сборка для версии, которая не изменяется.
"Снимки" - это сборка, которую можно заменить другой строкой, которая имеет одно и то же имя. Это подразумевает, что сборка может измениться в любое время и все еще находится в активной разработке.
У вас разные артефакты для разных сборников на основе одного и того же кода. Например. у вас может быть одна с отладкой и одна без нее. Один для Java 5.0 и один для Java 6. Как правило, его проще иметь одну сборку, которая делает все, что вам нужно.;)
Версия Maven может содержать строковый литерал "SNAPSHOT", чтобы показать, что проект в настоящее время находится в активной разработке.
Например, если ваш проект имеет версию "1.0-SNAPSHOT", и вы развертываете эти артефакты проектов в репозиторий Maven, Maven расширит эту версию до "1.0-20080207-230803-1", если вы планируете развернуть выпуск на 11: 08 PM 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
Вот как выглядит снимок для репозитория, и в этом случае он не включен, что означает, что репозиторий, упомянутый здесь, является стабильным, и нет необходимости в обновлениях.
<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 builds: SNAPSHOT - это специальная версия, которая указывает текущую версию развертывания, не похожую на обычную версию, maven проверяет версию для каждой сборки в удаленном репозитории, поэтому сборки моментальных снимков - это ничего, кроме сборок для обслуживания.
Релиз сборки: Release означает удаление SNAPSHOT в версии для сборки, это обычные версии сборки.
Я хотел бы остановиться на терминологии. Другие ответы дали хорошие объяснения о том, что такое "снимок" версии в контексте Maven. Но следует ли из этого, что не -SNAPSHOT версия должна быть названа "релизной" версией?
Все еще существует некоторая напряженность между идеей семантического отклонения версии "релиза", которая, как представляется, может быть любой версией, которая не имеет -SNAPSHOT
такого как -SNAPSHOT
но также не имеет -beta.4
такого как -beta.4
; и идея идеи Maven о "релизной" версии, которая, по-видимому, включает только отсутствие -SNAPSHOT
.
Другими словами, существует семантическая двусмысленность того, означает ли "выпуск" "мы можем выпустить его для Maven Central" или "программное обеспечение находится в окончательном выпуске для общественности". Мы могли бы считать -beta.4
версией "релиза", если -beta.4
ее для публики, но это не "финальная версия". Семантическое управление версиями ясно говорит, что что-то вроде -beta.4
является "предварительной версией", поэтому было бы бессмысленно называть ее "релизной" версией, даже без -SNAPSHOT
. На самом деле, по определению, даже -rc.5
является кандидатом на выпуск, а не на настоящий выпуск, хотя мы можем разрешить публичный доступ для тестирования.
Таким образом, несмотря на это, по моему мнению, более уместно называть " -beta.4
" версию, в которой вообще нет -beta.4
, даже -beta.4
. Возможно, лучшим названием для версии Maven non -SNAPSHOT будет "стабильная" версия (вдохновленная https://stackoverflow.com/questions/5901378/what-exactly-is-a-maven-snapshot-and-why-do-we-need-it). Таким образом, мы бы имели:
1.2.3-beta.4-SNAPSHOT
: снимок версии предварительной версии.1.2.3-SNAPSHOT
: снимок версии релизной версии.1.2.3-beta.4
: стабильная версия предварительной версии.1.2.3
: продакшен версия (очевидно, стабильная, не -SNAPSHOT).