Что такое снимок Maven и зачем он нам нужен?
Я немного озадачен смыслом снимка Maven и почему мы его создаем?
16 ответов
Версия снимка в Maven - это версия, которая еще не была выпущена.
Идея состоит в том, что перед 1.0
выпуск (или любой другой выпуск) сделан, существует 1.0-SNAPSHOT
, Эта версия может стать 1.0
, Это в основном1.0
в разработке ". Это может быть близко к реальному 1.0
выпустить или довольно далеко (сразу после 0.9
релиз, например).
Разница между "реальной" версией и версией снимка заключается в том, что снимки могут получать обновления. Это означает, что загрузка 1.0-SNAPSHOT
сегодня может дать файл, отличный от загрузки его вчера или завтра.
Как правило, зависимости моментальных снимков должны существовать только во время разработки, и ни одна выпущенная версия (т. Е. Отсутствие снимков) не должна зависеть от версии моментального снимка.
Три других ответа дают вам хорошее видение того, что -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
может быть:
- всегда: Maven будет проверять наличие новой версии при каждой сборке;
- ежедневно, значение по умолчанию;
- интервал: XXX: интервал в минутах (XXX)
- никогда: Maven никогда не будет пытаться получить другую версию. Это будет сделано, только если он не существует локально. С конфигурацией,
SNAPSHOT
Версия будет обрабатываться как стабильные библиотеки.
(модель settings.xml можно найти здесь)
Термин "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
: Версия выпуска (очевидно, это стабильная версия без снимков).
Обычно в maven у нас есть два типа сборок 1) сборки снимков 2) выпуск сборок
сборки снимка:SNAPSHOT - это специальная версия, которая указывает текущую копию развертывания, отличную от обычной версии, maven проверяет версию для каждой сборки в удаленном репозитории, поэтому сборки снимка представляют собой не что иное, как вспомогательные сборки.
Выпуск сборки: выпуск означает удаление SNAPSHOT в версии для сборки, это обычные версии сборки.
Maven SNAPSHOT - это артефакт, созданный сборкой Maven и претендующий на помощь разработчикам в цикле разработки программного обеспечения. SNAPSHOT - это артефакт (или результат сборки проекта), который не претендует на то, чтобы его нигде использовали, это только временно.jar, ear,..., созданный для тестирования процесса сборки или для проверки новых требований, которые еще не готовы к работе. в производственную среду. После того, как вы будете довольны качеством артефакта SNAPSHOT, вы можете создать артефакт RELEASE, который можно использовать в других проектах или развернуть сам.
В своем проекте вы можете определить SNAPSHOT, используя элемент version в файле pom.xml Maven:
<groupId>example.project.maven</groupId>
<artifactId>MavenEclipseExample</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<description>Maven pom example</description>
Если вы хотите лучше понять Maven, вы также можете изучить эти статьи:
Зависимости моментальных снимков Зависимости моментальных снимков — это зависимости (файлы JAR), которые находятся в стадии разработки. Вместо того, чтобы постоянно обновлять номера версий для получения последней версии, вы можете полагаться на моментальную версию проекта. Версии моментальных снимков всегда загружаются в ваш локальный репозиторий для каждой сборки, даже если соответствующая версия моментального снимка уже находится в вашем локальном репозитории. Постоянная загрузка зависимостей моментальных снимков гарантирует, что у вас всегда будет самая последняя версия в вашем локальном репозитории для каждой сборки.
ваш pom содержит много зависимостей -SNAPSHOT, и эти зависимости -SNAPSHOT являются движущейся целью
https://dzone.com/articles/maven-release-plugin-in-the-enterprisehttps://javarevisited.blogspot.com/2019/03/top-5-course-to-learn-apache-maven-for .html https://www.mojohaus.org/versions-maven-plugin/examples/lock-snapshots.htmlhttp://tutorials.jenkov.com/maven/maven-tutorial.html
Вот так выглядит моментальный снимок для репозитория, и в этом случае он не включен, что означает, что указанный здесь репозиторий стабилен и не требует обновлений.
<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.0.0 -SNAPSHOT означает, что это нестабильная версия, и ищите удаленный репозиторий для разрешения зависимостей
Значение SNAPSHOT относится к «последнему» коду в ветке разработки и не дает гарантии, что код стабилен или неизменен. И наоборот, код в «релизной» версии (любое значение версии без суффикса SNAPSHOT) остается неизменным.
Другими словами, версия SNAPSHOT — это версия «разработки», предшествующая окончательной версии «релиза». SNAPSHOT «старее» своего релиза.
В процессе выпуска версия xy-SNAPSHOT изменяется на xy. В процессе выпуска версия разработки также увеличивается до x.(y+1)-SNAPSHOT. Например, версия 1.0-SNAPSHOT выпущена как версия 1.0, а новая версия разработки — версия 1.1-SNAPSHOT.
Как следует из названия, моментальный снимок относится к состоянию проекта и его зависимостей в данный момент времени. Каждый раз, когда maven находит новый снимок проекта, он загружает и заменяет старый файл.jar проекта в локальном репозитории.
Версии снэпшотов используются для проектов, находящихся в активной разработке. Если ваш проект зависит от программного компонента, который находится в активной разработке, вы можете полагаться на выпуск моментального снимка, и Maven будет периодически пытаться загрузить последний снимок из репозитория при запуске сборки.
Понимание контекста SDLC поможет понять разницу между снимком и выпуском. В процессе разработки все разработчики вносят свои функции в базовую ветку. В какой-то момент ведущий думает, что накопилось достаточно функций, и он отключит ветку релиза от базовой ветки. Любые сборки до этого момента времени являются снимками. Посты постов на данный момент являются релизами. Следует отметить, что сборки выпуска могут также измениться перед запуском в производство, если в ходе тестирования выпуска будут обнаружены дефекты.
На этапе разработки моментальные снимки Maven каждый день ищут более новую более высокую версию, если она доступна в репозитории nexus, и загружают ее локально для следующей сборки.
Четыре варианта, которые вы можете установить в определении репозитория
Всегда, Ежедневно (по умолчанию), Интервал, Никогда,
Примечание. В рабочей версии у нас не должно быть зависимости от версии моментального снимка.