나는 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
버전이 안정적인 라이브러리로 처리됩니다.
답변
“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이이 저장소에 대한 업데이트를 찾을 것임을 의미합니다. 태그를 사용하여 업데이트 간격을 지정할 수도 있습니다.