Что такое снимок Maven и зачем он нам нужен?

685

Я немного смущен о значении моментального снимка Maven и почему мы строим его?

Теги:
maven
dependency-management

8 ответов

837
Лучший ответ

Версия моментального снимка в Maven - это тот, который не был выпущен.

Идея заключается в том, что завершена до версия 1.0 (или любая другая версия), существует 1.0-SNAPSHOT. Эта версия может стать 1.0. Это в основном "1.0 в разработке". Это может быть близко к реальной версии 1.0 или довольно далеко (сразу после выпуска 0.9, например).

Разница между "реальной" версией и версией моментального снимка заключается в том, что моментальные снимки могут получать обновления. Это означает, что загрузка 1.0-SNAPSHOT сегодня может дать другой файл, чем загрузка его вчера или завтра.

Обычно зависимости от моментального снимка должны быть только во время разработки, и никакая выпущенная версия (т.е. без моментального снимка) должна иметь зависимость от версии моментального снимка.

  • 0
    Так что снимок всегда более стабильный, я полагаю. И этот номер сборки относится только к какой версии артефактов, а не к другой ветви исходного кода, это правильно?
  • 49
    @amphibient: Нет, снимок не обязательно более стабилен: это только последняя сборка. Снимок предшествует фактическому выпуску, он не идет после него. Действительно, номера версий обычно не относятся к веткам.
Показать ещё 4 комментария
655

Три других ответа дают вам хорошее представление о версии -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 может быть:

  • всегда: Maven будет проверять более новую версию для каждой сборки;
  • ежедневно, значение по умолчанию;
  • интервал: XXX: интервал в минутах (XXX)
  • никогда: Maven никогда не попытается извлечь другую версию. Он будет делать это только в том случае, если он не существует локально. С конфигурацией версия SNAPSHOT будет обрабатываться как стабильные библиотеки.

(здесь можно найти модель settings.xml

  • 1
    Кажется, можно использовать переключатель командной строки для принудительной повторной загрузки maven всех версий SNAPSHOT : mvn clean package -U согласно учебному пособию по maven
  • 3
    Осторожнее с флагом -U . Это может не сделать то, что вы ожидаете из-за MNG-4142 .
Показать ещё 4 комментария
55

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

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

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

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

  • 0
    С точки зрения семантического управления версиями -SNAPSHOT будет предварительным выпуском: « Предварительная версия указывает, что версия нестабильна и может не удовлетворять предполагаемым требованиям совместимости, как обозначено связанной с ней нормальной версией. Примеры: 1.0.0 -альфа, 1,0,0-альфа.1, 1,0,0-0,3,7, 1,0,0-х,7.з.92. "
  • 3
    Мне кажется, что «SNAPSHOT» - это не «снимок вашего кода в определенное время», а «последняя сборка доступного кода». Если бы это был HTTP, это был бы флаг, который говорит: «Не надо делать HEAD, иди и получи все, что есть на сервере». Действительно, это почти противоположный «код в данный момент времени».
23

"release" - это окончательная сборка для версии, которая не изменяется.

"Снимки" - это сборка, которую можно заменить другой строкой, которая имеет одно и то же имя. Это подразумевает, что сборка может измениться в любое время и все еще находится в активной разработке.

У вас разные артефакты для разных сборников на основе одного и того же кода. Например. у вас может быть одна с отладкой и одна без нее. Один для Java 5.0 и один для Java 6. Как правило, его проще иметь одну сборку, которая делает все, что вам нужно.;)

11

Версия 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

Изображение 1409

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 будет искать обновления для этого репозитория. Вы также можете указать интервал для обновлений с тегом.

1

обычно в maven у нас есть два типа сборки: 1) Снимки сборки 2) Релиз сборки

  1. snapshot builds: SNAPSHOT - это специальная версия, которая указывает текущую версию развертывания, не похожую на обычную версию, maven проверяет версию для каждой сборки в удаленном репозитории, поэтому сборки моментальных снимков - это ничего, кроме сборок для обслуживания.

  2. Релиз сборки: Release означает удаление SNAPSHOT в версии для сборки, это обычные версии сборки.

0

Я хотел бы остановиться на терминологии. Другие ответы дали хорошие объяснения о том, что такое "снимок" версии в контексте 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).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню