Что такое снимок Maven и зачем он нам нужен? - PullRequest
743 голосов
/ 05 мая 2011

Я немного озадачен смыслом снимка Maven и почему мы его создаем?

Ответы [ 11 ]

884 голосов
/ 05 мая 2011

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

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

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

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

729 голосов
/ 06 мая 2011

Три других ответа дают вам хорошее представление о том, что такое -SNAPSHOT версия.Я просто хотел добавить некоторую информацию о поведении Maven, когда он находит зависимость SNAPSHOT.

При создании приложения Maven будет искать зависимости в локальном репозитории.Если стабильная версия там не найдена, она будет искать удаленные репозитории (определенные в settings.xml или pom.xml), чтобы найти эту зависимость.Затем он скопирует его в локальный репозиторий, чтобы сделать его доступным для следующих сборок.

Например, библиотека foo-1.0.jar считается версией stable , а если 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 можно найти здесь)

60 голосов
/ 05 мая 2011

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

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

Для некоторой помощи с версионированием, ознакомьтесь со спецификацией Semantic Versioning .

23 голосов
/ 05 мая 2011

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

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

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

15 голосов
/ 13 июля 2017

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

Например, если у вашего проекта есть версия «1.0-SNAPSHOT», и вы развернули этот проектЕсли артефакты находятся в репозитории Maven, Maven расширит эту версию до «1.0-20080207-230803-1», если вы развернете выпуск в 23:08 7 февраля 2008 года по Гринвичу.Другими словами, при развертывании моментального снимка вы не выпускаете программный компонент;вы выпускаете снимок компонента в определенное время.

Таким образом, в основном версии снимков используются для проектов в активной разработке.Если ваш проект зависит от программного компонента, находящегося в стадии активной разработки, вы можете зависеть от выпуска моментального снимка, и Maven будет периодически пытаться загрузить последний моментальный снимок из репозитория при запуске сборки.Точно так же, если в следующем выпуске вашей системы будет версия «1.8», ваш проект будет иметь версию «1.8-SNAPSHOT», пока она не будет официально выпущена.

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

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

Maven

Пример процесса выпуска Maven

enter image description here

4 голосов
/ 19 декабря 2018

Я хотел бы высказать мнение о терминологии. Другие ответы дали хорошие объяснения о том, что такое «снимок» версии в контексте Maven. Но следует ли из этого, что версия без снэпшота должна называться версией выпуска?

Существует некоторая напряженность между идеей семантического управления версиями "релизной" версии, которая может показаться любой версией, которая не имеет спецификатора, такого как -SNAPSHOT, но также не имеет спецификатора, например -beta.4; и идея Maven о «релизной» версии, которая, похоже, включает в себя отсутствие -SNAPSHOT.

Другими словами, существует семантическая двусмысленность того, означает ли «выпуск» «мы можем выпустить его для Maven Central» или «программное обеспечение находится в окончательном выпуске для общественности». Мы могли бы рассмотреть -beta.4 как «релизную» версию, если мы выпустим ее для общественности, но это не «финальная версия». Семантическое управление версиями ясно говорит, что что-то вроде -beta.4 является «предварительной версией», поэтому не имеет смысла называть ее «релизной» версией, даже без -SNAPSHOT. На самом деле по определению даже -rc.5 является релизом кандидат , а не реальным релизом, хотя мы можем разрешить публичный доступ для тестирования.

Так что, несмотря на это, Maven, на мой взгляд, более уместно назвать только «релизную» версию, в которой вообще нет спецификатора, даже не -beta.4. Возможно, лучшим названием для версии без снимков Maven будет «стабильная» версия (вдохновленная другой ответ ). Таким образом, мы получили бы:

  • 1.2.3-beta.4-SNAPSHOT: снимок версии предварительной версии.
  • 1.2.3-SNAPSHOT: снимок версии выпуска.
  • 1.2.3-beta.4: стабильная версия предварительной версии.
  • 1.2.3: версия выпуска (очевидно, это стабильная версия без снимков).
4 голосов
/ 08 августа 2014

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

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

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

4 голосов
/ 02 декабря 2013

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

<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 голос
/ 04 мая 2019

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

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

0 голосов
/ 06 июля 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...