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

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

+743
05 мая '11 в 16:50
источник поделиться
11 ответов

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

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

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

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

+881
05 мая '11 в 16:57
источник

Связанные вопросы


Похожие вопросы

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

+727
06 мая '11 в 6:41
источник

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

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

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

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

+60
05 мая '11 в 16:55
источник

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

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

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

+23
05 мая '11 в 16:54
источник

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

enter image description here

+15
13 июл. '17 в 13:46
источник

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

  • 1.2.3-beta.4-SNAPSHOT: снимок версии предварительной версии.
  • 1.2.3-SNAPSHOT: снимок версии релизной версии.
  • 1.2.3-beta.4: стабильная версия предварительной версии.
  • 1.2.3: продакшен версия (очевидно, стабильная, не -SNAPSHOT).
+4
19 дек. '18 в 17:44
источник

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

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

+4
02 дек. '13 в 12:08
источник

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

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

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

+4
08 авг. '14 в 7:14
источник

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

когда версия включает снимок, например 1.0.0 -SNAPSHOT, это означает, что это нестабильная версия, и ищите удаленный репозиторий для разрешения зависимостей

+1
04 мая '19 в 17:10
источник

Понимание контекста SDLC поможет понять разницу между снимком и выпуском. В процессе разработки все разработчики вносят свои функции в базовую ветку. В какой-то момент ведущий думает, что накопилось достаточно функций, и он отключит ветку релиза от базовой ветки. Любые сборки до этого момента времени являются снимками. Посты постов на данный момент являются релизами. Следует отметить, что сборки выпуска могут также измениться перед запуском в производство, если в ходе тестирования выпуска будут обнаружены дефекты.

0
27 февр. '19 в 0:30
источник

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

0
06 июл. '19 в 7:30
источник

Посмотрите другие вопросы по меткам или Задайте вопрос