Maven Snapshot은 정확히 무엇이며 왜 필요합니까?


답변:


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"일 필요는 없으며 반드시 릴리스 이전 일 필요는 없습니다. 그러나 다른 모든 것은 옳습니다-움직이는 대상에 대한 불안정한 참조이며 반복 가능한 빌드를 만들 수 없습니다.
Scott Carey

3
감사합니다 @ScottCarey. "이동 대상"이 결국 존재한다는 보장조차 없기 때문에 "일반적으로 선행"은 실제로 더 정확할 것입니다.
avandeursen

1
@Jay : 아니요, 특정 SNAPSHOT을 명시 적으로 참조하는 방법이 없다는 것을 알기 만하면 설계 상 주소 지정 / 교환이 불가능합니다. 세분화 된 버전 관리가 필요한 경우 특정 버전 문자열 (-RC1, -RC2 또는 이와 유사한 것)로 릴리스 후보를 릴리스해야합니다.
Joachim Sauer

14
왜 그냥 " 1.0-DEVELOPMENT"또는 " 1.0-INPROGRESS" 처럼 전화를 걸 수
없습니까

791

다른 세 가지 답변은 -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있을 수 있습니다 :

  • always : Maven은 모든 빌드에서 최신 버전을 확인합니다.
  • 매일 기본값입니다.
  • interval : XXX : 분 간격 (XXX)
  • never : Maven은 다른 버전을 검색하지 않습니다. 로컬에 존재하지 않는 경우에만 그렇게 할 것입니다. 구성을 사용하면 SNAPSHOT버전이 안정적인 라이브러리로 처리됩니다.

(settings.xml의 모델은 여기 에서 찾을 수 있습니다)


2
모든 다시 다운로드 받는다는 힘을 명령 줄 스위치를 사용할 수 있습니다 보인다 SNAPSHOT버전 : mvn clean package -U같은 당 받는다는 튜토리얼
드미트리 K

3
-U깃발 조심해 . MNG-4142 로 인해 예상대로 작동하지 않을 수 있습니다 .
Kevin Cross

3
또한 모범 사례에서는 릴리스 버전을 만들 때 스냅 샷 종속성을 사용하지 않아도되며 스냅 샷 종속성이있는 경우 Maven Release Plugin이 실패합니다.
RCross

2
mvn install로컬 저장소에 1.0-SNAPSHOT 버전의 jar 파일을 설치하기 위해 실행 했습니다. 그 다음날 나는 프로젝트를 변경했지만 버전 mvn install을 변경하지 않았습니다. 실행시 로컬 리포지토리에서 변경되지 않는 것 같습니다. 예상되는 동작입니까? 버전 mvn install을 변경 한 후에 는 재사용하여 버전을 덮어 쓸 수 없습니까?
Don Cheadle

1
@mmcrae AFAIK 업데이트해야합니다. 무엇 그게 전부 설치 목표는 로컬 스냅 샷의 항아리를 업데이트 할. 다른 것을 발견하셨습니까?
Johnny

73

"SNAPSHOT"용어는 빌드가 주어진 시간에 코드의 스냅 샷임을 의미합니다.

일반적으로이 버전은 아직 개발 중입니다.

코드가 준비되고 릴리스 될 때가되면 POM에 나열된 버전을 변경해야합니다. 그런 다음 "SNAPSHOT"대신 "1.0"과 같은 레이블을 사용합니다.

버전 관리에 대한 도움이 필요하면 시맨틱 버전 관리 사양을 확인하십시오 .


시맨틱 버전 관리 측면 에서, -SNAPSHOT 릴리스는 시험판 일 것 입니다. - 알파, 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
@Joker "무거운"은 많은 것들이 변할 때입니다 (새로운 기능, 리팩토링 등)
robert

28

"릴리스"는 변경되지 않은 버전의 최종 빌드입니다.

"스냅 샷"은 동일한 이름을 가진 다른 빌드로 대체 될 수있는 빌드입니다. 빌드가 언제든지 변경 될 수 있으며 여전히 개발 중임을 의미합니다.

동일한 코드를 기반으로 다른 빌드에 대해 다른 아티팩트가 있습니다. 예를 들어 디버깅이 있거나없는 것이있을 수 있습니다. 하나는 Java 5.0 용이고 다른 하나는 Java 6 용입니다. 일반적으로 필요한 모든 것을 수행하는 하나의 빌드를 갖는 것이 더 간단합니다. ;)


21

Maven 버전에는 프로젝트가 현재 개발 중임을 나타내는 문자열 리터럴 "SNAPSHOT"이 포함될 수 있습니다.

예를 들어 프로젝트의 버전이 "1.0-SNAPSHOT"이고이 프로젝트의 아티팩트를 Maven 저장소에 배치하는 경우 Maven은 11에 릴리스를 배치하는 경우이 버전을 "1.0-20080207-230803-1"로 확장합니다 : 2008 년 2 월 7 일 UTC 오후 08시. 다시 말해, 스냅 샷을 배포 할 때 소프트웨어 구성 요소를 릴리스하지 않습니다. 특정 시간에 구성 요소의 스냅 샷을 공개합니다.

따라서 주로 스냅 샷 버전은 개발중인 프로젝트에 사용됩니다. 프로젝트가 개발중인 소프트웨어 구성 요소에 의존하는 경우 스냅 샷 릴리스에 의존 할 수 있으며 Maven은 빌드를 실행할 때 저장소에서 최신 스냅 샷을 주기적으로 다운로드하려고 시도합니다. 마찬가지로, 시스템의 다음 릴리스 버전이 "1.8"이면 프로젝트는 공식적으로 릴리스 될 때까지 "1.8-SNAPSHOT"버전이됩니다.

예를 들어, 다음 종속성은 항상 최신 1.8 개발 JAR 스프링을 다운로드합니다.

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

메이븐

메이븐 릴리스 프로세스의 예

여기에 이미지 설명을 입력하십시오


6

용어에 대해 지적하고 싶습니다. 다른 답변은 Maven과 관련하여 "스냅 샷"버전이 무엇인지에 대한 좋은 설명을 제공했습니다. 그러나 스냅 샷이 아닌 버전을 "릴리스"버전이라고해야합니까?

"릴리즈"버전의 시맨틱 버전 화 아이디어 사이에는 약간의 긴장이 있습니다.이 버전은 같은 한정자 -SNAPSHOT를 가지지 않지만 -beta.4; 그리고 "release"버전에 대한 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: 릴리스 버전 (안정적이고 스냅 샷이 아닌 버전 임).

maven이 빌드 메타 데이터 또는 시험판 명명 규칙을 처리하는 방법에 대한 정보가 있습니까? 우리 모두 알파가 베타보다 앞서는 것을 알고 있지만 메이븐은 알고 있습니까? 안정적인 릴리스로 1.2.3-beta.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의 컨텍스트를 이해하면 스냅 샷과 릴리스의 차이점을 이해하는 데 도움이됩니다. 개발 프로세스 동안 개발자는 모두 자신의 기능을 기본 분기에 제공합니다. 어느 시점에서 리드는 충분한 기능이 누적되었다고 생각하고 기준 분기에서 릴리스 분기를 잘라냅니다. 이 시점 이전의 모든 빌드는 스냅 샷입니다. 이 시점까지의 빌드는 릴리스입니다. 릴리스 테스트 중에 결함이 발견되면 릴리스 빌드도 프로덕션으로 이동하기 전에 변경 될 수 있습니다.


1

Snapshot은 단순히 구성에 따라 다릅니다. Maven은 특별한 종속성에 대한 최신 변경 사항을 확인합니다. 스냅 샷은 개발 중이기 때문에 불안정하지만 특수 프로젝트에서 최신 변경이 필요한 경우 종속성 버전을 스냅 샷 버전으로 구성해야합니다. 이 시나리오는 여러 제품이있는 대기업에서 이러한 제품이 서로 밀접하게 관련되어 있습니다.


0

이름에서 알 수 있듯이 스냅 샷은 프로젝트 상태와 해당 시점의 종속성을 나타냅니다. maven은 프로젝트의 최신 SNAPSHOT을 찾을 때마다 로컬 저장소에서 프로젝트의 이전 .jar 파일을 다운로드하고 바꿉니다.

스냅 샷 버전은 현재 개발중인 프로젝트에 사용됩니다. 프로젝트가 개발중인 소프트웨어 구성 요소에 의존하는 경우 스냅 샷 릴리스에 의존 할 수 있으며 Maven은 빌드를 실행할 때 저장소에서 최신 스냅 샷을 주기적으로 다운로드하려고 시도합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.