it-swarm.com.ru

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

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

738
meisam

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

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

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

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

875
Joachim Sauer

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

727
Romain Linsolas

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

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

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

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

60
jjnguy

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

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

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

23
Peter Lawrey

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

Например, если ваш проект имеет версию "1.0-SNAPSHOT" и вы развернули артефакты этого проекта в репозитории Maven, Maven расширит эту версию до "1.0-20080207-230803-1", если вы развернете выпуск на 11 : 08 PM 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

enter image description here

15
Joby Wilson Mathews

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

<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
Kati Holasz

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

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

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

4
Venky Vungarala

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

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

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

0
shanika prasangika

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

0
CCNA