Что такое снимок 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
792

Три других ответа дают вам хорошее представление о том, что такое -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 можно найти здесь)

Ромэн Линсолас
источник
2
Кажется, можно использовать переключатель командной строки для принудительной повторной загрузки maven всех SNAPSHOTверсий: mvn clean package -Uв соответствии с руководством maven
Dimitry K
3
Осторожнее с -Uфлагом. Это может не сделать то, что вы ожидаете из-за MNG-4142 .
Кевин Кросс
3
Также стоит упомянуть, что в соответствии с хорошей практикой вы не должны использовать зависимости моментальных снимков при создании релизной версии, и действительно, плагин релиза Maven завершится ошибкой, если будут присутствовать зависимости моментальных снимков.
RCross
2
Я побежал mvn installустанавливать флягу версии 1.0-SNAPSHOT в мой локальный репозиторий. На следующий день я внес изменения в проект, но не изменил версию - тогда при запуске mvn installон не изменился в моем локальном репо. Это ожидаемое поведение? Можно ли повторно использовать версию и перезаписать ее mvn installпосле внесения изменений в нее?
Дон Чидл
1
@mmcrae AFAIK это должно быть обновлено. Вот что делает цель установки , обновляя локальные файлы SNAPSHOT. Вы обнаружили что-то еще?
Джонни
73

Термин «SNAPSHOT» означает, что сборка представляет собой снимок вашего кода в определенный момент времени.

Обычно это означает, что эта версия все еще находится в стадии разработки.

Когда код будет готов и пришло время его выпустить, вы захотите изменить версию, указанную в POM. Тогда вместо «SNAPSHOT» вы бы использовали метку типа «1.0».

Для некоторой помощи с управлением версиями, проверьте Спецификацию Семантического Версионирования .

jjnguy
источник
С точки зрения семантического управления версиями -SNAPSHOT будет предварительным выпуском: « Предварительная версия указывает, что версия нестабильна и может не удовлетворять предполагаемым требованиям совместимости, как обозначено связанной с ней нормальной версией. Примеры: 1.0.0 -альфа, 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
@ Джокер "тяжелый" - это когда многое меняется (новые функции, рефакторинг и т. Д.)
Роберт
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», пока она не будет официально выпущена.

Например, следующая зависимость всегда будет загружать последнюю версию JAR версии 1.8 Spring:

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

специалист

Пример процесса релиза Maven

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

Джоби Уилсон Мэтьюз
источник
6

Я хотел бы остановиться на терминологии. Другие ответы дали хорошие объяснения о том, что такое «снимок» версии в контексте 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.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 поможет понять разницу между снимком и выпуском. В процессе разработки все разработчики вносят свои функции в базовую ветку. В какой-то момент ведущий думает, что накопилось достаточно функций, и он отключит ветку релиза от базовой ветки. Любые сборки до этого момента времени являются снимками. Посты постов на данный момент являются релизами. Следует отметить, что сборки выпуска могут также измениться перед запуском в производство, если в ходе тестирования выпуска будут обнаружены дефекты.

CCNA
источник
1

Снимок просто означает, что в зависимости от вашей конфигурации Maven будет проверять последние изменения по специальной зависимости. Снимок нестабилен, потому что он находится в стадии разработки, но если в специальном проекте необходимо внести последние изменения, необходимо настроить версию зависимости на версию снимка. Этот сценарий возникает в больших организациях с несколькими продуктами, которые эти продукты очень тесно связаны друг с другом.

Махди Солтани
источник
0

Как следует из названия, снимок относится к состоянию проекта и его зависимостей в данный момент времени. Всякий раз, когда maven находит новый SNAPSHOT проекта, он загружает и заменяет старый файл .jar проекта в локальном хранилище.

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

Сурабх Бхавсар
источник