1. 개요
이 예제에서는 Maven 스냅샷과 릴리스 리포지토리의 차이점을 설명합니다.
2. 메이븐 리포지토리
Maven 리포지토리는 애플리케이션에서 의존성으로 사용할 수 있는 사전 컴파일된 아티팩트 모음을 보유합니다. 기존 Java 애플리케이션에서는 일반적으로 .jar 파일입니다.
일반적으로 리포지토리에는 로컬과 원격의 두 가지 유형이 있습니다.
로컬 리포지토리는 Maven이 빌드 중인 컴퓨터에 생성하는 리포지토리입니다. 일반적으로 $HOME/.m2/repository 디렉토리 아래에 있습니다.
애플리케이션을 빌드할 때 Maven은 로컬 저장소에서 의존성을 검색합니다. 특정 의존성을 찾을 수 없는 경우 Maven은 원격 저장소( settings.xml 또는 pom.xml 파일 내에 정의됨)에서 이를 검색합니다. 또한 향후 사용을 위해 로컬 리포지토리에 의존성을 복사합니다.
원격 저장소는 아티팩트가 포함된 외부 저장소입니다. Maven이 원격 저장소에서 아티팩트를 다운로드하면 아티팩트 다운로드를 제한하기 위해 로컬 저장소에서 아티팩트를 찾는 것을 선호합니다.
또한 스냅샷과 릴리스 리포지토리 간의 아티팩트 유형을 기반으로 리포지토리를 구분할 수 있습니다.
3. 스냅샷 리포지토리
스냅샷 리포지토리는 릴리스되지 않은 증분 아티팩트 버전에 사용되는 리포지토리입니다.
스냅샷 버전은 아직 출시되지 않은 버전입니다. 일반적인 아이디어는 릴리스된 버전 전에 스냅샷 버전을 갖는 것입니다. 이를 통해 프로젝트에서 사용 중인 아티팩트 버전을 업그레이드하지 않고도 동일한 임시 버전을 점진적으로 배포할 수 있습니다. 이러한 프로젝트는 동일한 버전을 사용하여 업데이트된 스냅샷 버전을 가져올 수 있습니다.
예를 들어 버전 1.0.0 을 출시하기 전에 스냅샷 버전을 가질 수 있습니다. 스냅샷 버전에는 버전 뒤에 SNAPSHOT 접미사가 있습니다(예: 1.0.0-SNAPSHOT ).
3.1. 아티팩트 배포
지속적인 개발은 일반적으로 스냅샷 버전 관리를 사용합니다. 스냅샷 버전을 사용하면 번호가 타임스탬프와 빌드 번호로 구성된 아티팩트를 배포할 수 있습니다.
SNAPSHOT 버전 으로 개발 중인 프로젝트가 있다고 가정해 보겠습니다 .
<groupId>com.baeldung</groupId>
<artifactId>maven-snapshot-repository</artifactId>
<version>1.0.0-SNAPSHOT</version>
자체 호스팅 Nexus 저장소 에 프로젝트를 배포할 예정 입니다.
먼저 아티팩트를 배포하려는 게시 리포지토리 정보를 정의하겠습니다. 배포 관리 플러그인을 사용할 수 있습니다.
<distributionManagement>
<snapshotRepository>
<id>nexus</id>
<name>nexus-snapshot</name>
<url>http://localhost:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
또한 mvn deploy 명령을 사용하여 프로젝트를 배포합니다.
배포 후 실제 아티팩트 버전에는 SNAPSHOT 값 대신 타임스탬프 값이 포함됩니다. 예를 들어 1.0.0-SNAPSHOT 을 배포할 때 실제 값에는 현재 타임스탬프와 빌드 번호(예: 1.0.0-20220709.063105-3 )가 포함됩니다.
타임스탬프 값은 아티팩트 배포 중에 계산됩니다. Maven은 체크섬을 생성하고 동일한 타임스탬프로 아티팩트 파일을 업로드합니다.
maven-metadata.xml 파일 에는 스냅샷 버전에 대한 정확한 정보와 최신 타임스탬프 값에 대한 링크가 포함되어 있습니다.
<metadata modelVersion="1.1.0">
<groupId>com.baeldung</groupId>
<artifactId>maven-snapshot-repository</artifactId>
<version>1.0.0-SNAPSHOT</version>
<versioning>
<snapshot>
<timestamp>20220709.063105</timestamp>
<buildNumber>3</buildNumber>
</snapshot>
<lastUpdated>20220709063105</lastUpdated>
<snapshotVersions>
<snapshotVersion>
<extension>jar</extension>
<value>1.0.0-20220709.063105-3</value>
<updated>20220709063105</updated>
</snapshotVersion>
<snapshotVersion>
<extension>pom</extension>
<value>1.0.0-20220709.063105-3</value>
<updated>20220709063105</updated>
</snapshotVersion>
</snapshotVersions>
</versioning>
</metadata>
메타데이터 파일은 스냅샷 버전에서 타임스탬프 값으로의 변환을 관리하는 데 도움이 됩니다.
동일한 스냅샷 버전으로 프로젝트를 배포할 때마다 Maven은 새 타임스탬프 값과 새 빌드 번호를 포함하는 버전을 생성합니다.
3.2. 아티팩트 다운로드
스냅샷 아티팩트를 다운로드하기 전에 Maven은 연결된 maven-metadata.xml 파일을 다운로드합니다. 이렇게 하면 Maven이 타임스탬프 값과 빌드 번호를 기반으로 최신 버전이 있는지 확인할 수 있습니다.
이러한 아티팩트의 검색은 여전히 SNAPSHOT 버전을 사용할 수 있습니다.
리포지토리에서 아티팩트를 다운로드하려면 먼저 의존성 리포지토리를 정의해야 합니다.
<repositories>
<repository>
<id>nexus</id>
<name>nexus-snapshot</name>
<url>http://localhost:8081/repository/maven-snapshots/</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>false</enabled>
</releases>
</repository>
</repositories>
스냅샷 버전은 기본적으로 활성화되어 있지 않습니다. 수동으로 활성화해야 합니다.
<snapshots>
<enabled>true</enabled>
</snapshots>
스냅샷을 활성화하면 최신 버전의 SNAPSHOT 아티팩트 를 확인하는 빈도를 정의할 수 있습니다 . 그러나 기본 업데이트 정책은 하루에 한 번으로 설정되어 있습니다. 다른 업데이트 정책을 설정하여 이 동작을 재정의할 수 있습니다.
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
updatePolicy 요소 안에 배치할 수 있는 네 가지 다른 값이 있습니다 .
- 항상 — 매번 최신 버전을 확인하십시오.
- 매일 (기본값) — 하루에 한 번 최신 버전 확인
- interval:mm — 분 단위로 설정된 간격을 기준으로 최신 버전 확인
- 절대로 — 최신 버전을 구하려고 시도하지 마십시오(이미 로컬에 있는 버전과 비교).
또한 updatePolicy 를 정의하는 대신 명령에 -U 인수를 전달하여 모든 스냅샷 아티팩트를 강제로 업데이트할 수 있습니다 .
mvn install -U
또한 의존성이 이미 다운로드되었고 체크섬이 로컬 저장소에 이미 있는 것과 동일한 경우 의존성이 다시 다운로드되지 않습니다.
다음으로 아티팩트의 스냅샷 버전을 프로젝트에 추가할 수 있습니다.
<dependencies>
<dependency>
<groupId>com.baeldung</groupId>
<artifactId>maven-snapshot-repository</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>
개발 단계에서 스냅샷 버전을 사용하면 아티팩트 버전이 여러 개 있는 것을 방지할 수 있습니다. 주어진 시간에 코드의 스냅샷을 포함할 빌드 의 동일한 SNAPSHOT 버전을 사용할 수 있습니다.
4. 릴리스 리포지토리
릴리스 저장소에는 아티팩트의 최종 버전(릴리스)이 포함되어 있습니다. 간단히 말해서 릴리스 아티팩트는 콘텐츠를 수정해서는 안 되는 아티팩트를 나타냅니다.
릴리스 리포지토리는 settings.xml 또는 pom.xml 파일 에 정의된 모든 리포지토리에 대해 기본적으로 활성화되어 있습니다.
4.1. 아티팩트 배포
이제 로컬 Nexus 리포지토리에 프로젝트를 배포해 보겠습니다. 개발을 마치고 프로젝트를 출시할 준비가 되었다고 가정해 보겠습니다.
<groupId>com.baeldung</groupId>
<artifactId>maven-release-repository</artifactId>
<version>1.0.0</version>
배포 관리자 내에서 릴리스 리포지토리를 정의해 보겠습니다.
<distributionManagement>
<repository>
<id>nexus</id>
<name>nexus-release</name>
<url>http://localhost:8081/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>nexus</id>
<name>nexus-snapshot</name>
<url>http://localhost:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
프로젝트 버전에서 SNAPSHOT 이라는 단어를 제거하면 배포 중에 스냅샷 리포지토리 대신 릴리스 리포지토리가 자동으로 선택됩니다.
또한 동일한 버전에서 아티팩트를 재배포하려는 경우 " 저장소에서 자산 업데이트를 허용하지 않습니다 "라는 오류가 발생할 수 있습니다 . 릴리스된 아티팩트 버전을 배포한 후에는 콘텐츠를 변경할 수 없습니다. 따라서 문제를 해결하려면 다음 버전을 출시하기만 하면 됩니다.
4.2. 아티팩트 다운로드
Maven은 기본적으로 Maven Central Repository 에서 구성 요소를 찾습니다 . 이 리포지토리는 기본적으로 릴리스 버전 정책을 사용합니다.
릴리스 리포지토리는 릴리스된 아티팩트만 해결합니다. 즉, 향후 콘텐츠가 변경되지 않아야 하는 게시된 아티팩트 버전만 포함해야 합니다.
릴리스된 아티팩트를 다운로드하려면 리포지토리를 정의해야 합니다.
<repository>
<id>nexus</id>
<name>nexus-release</name>
<url>http://localhost:8081/repository/maven-releases/</url>
</repository>
마지막으로 릴리스된 버전을 프로젝트에 간단히 추가해 보겠습니다.
<dependencies>
<dependency>
<groupId>com.baeldung</groupId>
<artifactId>maven-release-repository</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
5. 결론
이 예제에서는 Maven 스냅샷과 릴리스 리포지토리의 차이점을 배웠습니다. 요약하자면 아직 개발 중인 프로젝트에는 스냅샷 리포지토리를 사용하고 프로덕션 준비가 된 프로젝트에는 릴리스 리포지토리를 사용해야 합니다. 항상 그렇듯이 예제의 소스 코드는 GitHub에서 사용할 수 있습니다 .