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

나는 Maven Snapshot의 의미에 대해 약간 혼란스럽고 왜 우리가 그것을 만들었습니까?



답변

Maven의 스냅 샷 버전은 아직 출시되지 않은 버전입니다.

아이디어는 것입니다 전에1.0 릴리스 (또는 다른 버전)을 수행하는 존재 1.0-SNAPSHOT. 그 버전이 될 수 있습니다 1.0 . 기본적으로 ” 1.0개발 중”입니다. 이것은 실제 릴리스에 가깝1.0 거나 아주 먼 곳일 수 있습니다 ( 0.9예 : 릴리스 직후 ).

“실제”버전과 스냅 샷 버전의 차이점은 스냅 샷에 업데이트가있을 수 있다는 것입니다. 즉, 1.0-SNAPSHOT오늘 다운로드하면 어제 나 내일 다운로드하는 것과 다른 파일이 제공 될 수 있습니다.

일반적으로 스냅 샷 종속성은 개발 중에 존재 해야 하며 릴리스 된 버전이 없어야합니다 (즉, 스냅 샷이 아닌 스냅 샷 없음).


답변

다른 세 가지 답변은 -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의 모델은 여기 에서 찾을 수 있습니다)


답변

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

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

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

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


답변

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

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

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


답변

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>

메이븐

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

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


답변

용어에 대해 지적하고 싶습니다. 다른 답변은 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: 릴리스 버전 (안정적이고 스냅 샷이 아닌 버전 임).

답변

이것이 저장소의 스냅 샷 모양이며이 경우 활성화되지 않습니다. 즉, 여기에 언급 된 저장소가 안정적이며 업데이트가 필요하지 않습니다.

<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이이 저장소에 대한 업데이트를 찾을 것임을 의미합니다. 태그를 사용하여 업데이트 간격을 지정할 수도 있습니다.