Ответы:
Версия снимка в Maven - это версия, которая еще не была выпущена.
Идея заключается в том , что перед1.0
тем релиз (или любой другой релиз) делается, существует 1.0-SNAPSHOT
. Эта версия, что может стать 1.0
. Это в основном "в 1.0
стадии разработки". Это может быть близко к реальному 1.0
релизу или довольно далеко (например, сразу после 0.9
релиза).
Разница между «реальной» версией и версией снимка заключается в том, что снимки могут получать обновления. Это означает, что загрузка 1.0-SNAPSHOT
сегодня может дать другой файл, чем загрузка вчера или завтра.
Как правило, зависимости моментальных снимков должны существовать только во время разработки, и ни одна выпущенная версия (т. Е. Не снимок) не должна зависеть от версии моментального снимка.
1.0-DEVELOPMENT
или как» 1.0-INPROGRESS
, почему люди должны использовать неочевидные термины
Три других ответа дают вам хорошее представление о том, что такое -SNAPSHOT
версия. Я просто хотел добавить информацию о поведении Maven, когда он находит SNAPSHOT
зависимость.
Когда вы создаете приложение, Maven будет искать зависимости в локальном хранилище. Если стабильная версия там не найдена, она будет искать удаленные репозитории (определенные в 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 не будет проверять репозитории для более новой версии.
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 .
mvn install
устанавливать флягу версии 1.0-SNAPSHOT в мой локальный репозиторий. На следующий день я внес изменения в проект, но не изменил версию - тогда при запуске mvn install
он не изменился в моем локальном репо. Это ожидаемое поведение? Можно ли повторно использовать версию и перезаписать ее mvn install
после внесения изменений в нее?
Термин «SNAPSHOT» означает, что сборка представляет собой снимок вашего кода в определенный момент времени.
Обычно это означает, что эта версия все еще находится в стадии разработки.
Когда код будет готов и пришло время его выпустить, вы захотите изменить версию, указанную в POM. Тогда вместо «SNAPSHOT» вы бы использовали метку типа «1.0».
Для некоторой помощи с управлением версиями, проверьте Спецификацию Семантического Версионирования .
«Релиз» - это финальная сборка для версии, которая не изменяется.
«Снимок» - это сборка, которая может быть заменена другой сборкой с таким же именем. Это означает, что сборка может измениться в любое время и все еще находится в активной разработке.
У вас есть разные артефакты для разных сборок на основе одного и того же кода. Например, у вас может быть один с отладкой и один без. Один для 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», пока она не будет официально выпущена.
Например, следующая зависимость всегда будет загружать последнюю версию JAR версии 1.8 Spring:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
<version>1.8-SNAPSHOT”</version>
</dependency>
Пример процесса релиза Maven
Я хотел бы остановиться на терминологии. Другие ответы дали хорошие объяснения о том, что такое «снимок» версии в контексте Maven. Но следует ли из этого, что версия без снимка должна называться версией выпуска?
Существует некоторая напряженность между идеей семантического управления версиями «релизной» версии, которая может показаться любой версией, которая не имеет такого классификатора, как, -SNAPSHOT
но также не имеет такого классификатора, как -beta.4
; и идея Maven о «релизной» версии, которая, кажется, включает в себя только отсутствие -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 проекта в локальном хранилище.
Версии моментальных снимков используются для проектов, находящихся в активной разработке. Если ваш проект зависит от программного компонента, который находится в стадии активной разработки, вы можете зависеть от выпуска моментального снимка, и Maven будет периодически пытаться загрузить последний моментальный снимок из репозитория при запуске сборки.