Maven Snapshot은 정확히 무엇이며 왜 필요한가요?
Maven Snapshot의 의미와 빌드 이유에 대해 약간 혼란 스럽습니다.
Maven의 스냅 샷 버전은 출시되지 않은 버전입니다.
아이디어는 것입니다 전에1.0
릴리스 (또는 다른 버전)을 수행하는 존재 1.0-SNAPSHOT
. 그 버전이 될 수 있습니다 1.0
. 기본적으로 " 1.0
개발 중"입니다. 이것은 실제 릴리스에 가까울 수도 있고 1.0
꽤 멀 수도 있습니다 ( 0.9
예 : 릴리스 직후 ).
"실제"버전과 스냅 샷 버전의 차이점은 스냅 샷이 업데이트 될 수 있다는 것입니다. 즉, 1.0-SNAPSHOT
오늘 다운로드하면 어제 또는 내일 다운로드하는 것과 다른 파일이 제공 될 수 있습니다.
일반적으로 스냅 샷 종속성은 개발 중에 만 존재 해야 하며 릴리스 된 버전 (즉, 스냅 샷이 아닌)이 스냅 샷 버전에 대한 종속성을 가져서는 안됩니다.
다른 세 가지 답변은 -SNAPSHOT
버전이 무엇인지에 대한 좋은 비전을 제공합니다 . SNAPSHOT
종속성을 찾을 때 Maven의 동작에 대한 정보를 추가하고 싶었습니다 .
애플리케이션을 빌드 할 때 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은 모든 빌드에서 최신 버전을 확인합니다.
- daily , 기본값;
- interval : XXX : 분 간격 (XXX)
- never : Maven은 다른 버전을 검색하지 않습니다. 로컬에 존재하지 않는 경우에만 그렇게 할 것입니다. 구성을 통해
SNAPSHOT
버전은 안정적인 라이브러리로 처리됩니다.
(settings.xml의 모델은 여기 에서 찾을 수 있습니다)
"SNAPSHOT"용어는 빌드가 주어진 시간에 코드의 스냅 샷임을 의미합니다.
일반적으로이 버전은 아직 많이 개발 중임을 의미합니다.
코드가 준비되고 릴리스 할 때가되면 POM에 나열된 버전을 변경하는 것이 좋습니다. 그런 다음 "SNAPSHOT"대신 "1.0"과 같은 레이블을 사용합니다.
버전 관리에 대한 도움말은 시맨틱 버전 관리 사양을 확인하세요 .
"릴리스"는 변경되지 않는 버전의 최종 빌드입니다.
"스냅 샷"은 동일한 이름을 가진 다른 빌드로 대체 할 수있는 빌드입니다. 빌드가 언제든지 변경 될 수 있으며 아직 개발 중임을 의미합니다.
동일한 코드를 기반으로하는 다른 빌드에 대해 다른 아티팩트가 있습니다. 예를 들어 디버깅이있는 것과없는 것이있을 수 있습니다. 하나는 Java 5.0 용이고 다른 하나는 Java 6 용입니다. 일반적으로 필요한 모든 작업을 수행하는 하나의 빌드를 갖는 것이 더 간단합니다. ;)
Maven versions can contain a string literal "SNAPSHOT" to signify that a project is currently under active development.
For example, if your project has a version of “1.0-SNAPSHOT” and you deploy this project’s artifacts to a Maven repository, Maven would expand this version to “1.0-20080207-230803-1” if you were to deploy a release at 11:08 PM on February 7th, 2008 UTC. In other words, when you deploy a snapshot, you are not making a release of a software component; you are releasing a snapshot of a component at a specific time.
So mainly snapshot versions are used for projects under active development. If your project depends on a software component that is under active development, you can depend on a snapshot release, and Maven will periodically attempt to download the latest snapshot from a repository when you run a build. Similarly, if the next release of your system is going to have a version “1.8,” your project would have a “1.8-SNAPSHOT” version until it was formally released.
For example , the following dependency would always download the latest 1.8 development JAR of spring:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
<version>1.8-SNAPSHOT”</version>
</dependency>
An example of maven release process
I'd like to make a point about terminology. The other answers gave good explanations about what a "snapshot" version is in the context of Maven. But does it follow that a non-snapshot version should be termed a "release" version?
There is some tension between the semantic versioning idea of a "release" version, which would seem to be any version that does not have a qualifier such as -SNAPSHOT
but also does not have a qualifier such as -beta.4
; and Maven's idea idea of a "release" version, which only seems to include the absence of -SNAPSHOT
.
In other words, there is a semantic ambiguity of whether "release" means "we can release it to Maven Central" or "the software is in its final release to the public". We could consider -beta.4
to be a "release" version if we release it to the public, but it's not a "final release". Semantic versioning clearly says that something like -beta.4
is a "pre-release" version, so it wouldn't make sense for it to be called a "release" version, even without -SNAPSHOT
. In fact by definition even -rc.5
is a release candidate, not an actual release, even though we may allow public access for testing.
So Maven notwithstanding, in my opinion it seems more appropriate only to call a "release" version one that doesn't have any qualifier at all, not even -beta.4
. Perhaps a better name for a Maven non-snapshot version would be a "stable" version (inspired by another answer). Thus we would have:
1.2.3-beta.4-SNAPSHOT
: A snapshot version of a pre-release version.1.2.3-SNAPSHOT
: A snapshot version of a release version.1.2.3-beta.4
: A stable version of a pre-release version.1.2.3
: A release version (which is a stable, non-snapshot version, obviously).
This is how a snapshot looks like for a repository and in this case is not enabled, which means that the repository referred in here is stable and there's no need for updates.
<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>
Another case would be for:
<snapshots>
<enabled>true</enabled>
</snapshots>
which means that Maven will look for updates for this repository. You can also specify an interval for the updates with tag.
usually in maven we have two types of builds 1)Snapshot builds 2)Release builds
snapshot builds:SNAPSHOT is the special version that indicate current deployment copy not like a regular version, maven checks the version for every build in the remote repository so the snapshot builds are nothing but development builds.
Release builds:Release means removing the SNAPSHOT at the version for the build, these are the regular build versions.
simply snapshot means it is the version which is not stable one.
when version includes snapshot like 1.0.0 -SNAPSHOT means it is not stable version and look for remote repository to resolve dependencies
understanding the context of SDLC will help understand the difference between snapshot and the release. During the dev process developers all contribute their features to a baseline branch. At some point the lead thinks enough features have accumulated then he will cut a release branch from the baseline branch. Any builds prior to this time point are snapshots. Builds post to this point are releases. Be noted, release builds could change too before going to production if any defect spot during the release testing.
Snapshot simply means depending on your configuration Maven will check latest changes on a special dependency. Snapshot is unstable because it is under development but if on a special project needs to has a latest changes you must configure your dependency version to snapshot version. This scenario occurs in big organizations with multiple products that these products related to each other very closely.
Snapshot is a special version which indicates the current development copy of the project which is being worked on. For each build, maven always checks out for a SNAPSHOT of the project.
Whenever maven finds a newer SNAPSHOT of the project, it downloads and replaces the older .jar file of the project in the local repository.
Snapshot version always gets some updates/changes being made on the project. Also, Snapshot should exist only during development phase and it will not be having a release version. This implies that the build of the project will be changed at any time and it is still under the development process.
When you build an application, Maven will search for dependencies in the local repository. If a stable version is not found there, it will search the remote repositories (defined in pom.xml) to retrieve this dependency. Then, it will copy it into the local repository, to make it available for the next builds.
참고URL : https://stackoverflow.com/questions/5901378/what-exactly-is-a-maven-snapshot-and-why-do-we-need-it
'developer tip' 카테고리의 다른 글
엄격한 앨리어싱 규칙은 무엇입니까? (0) | 2020.09.29 |
---|---|
jQuery 비활성화 / 활성화 제출 버튼 (0) | 2020.09.29 |
모든 com.android.support 라이브러리는 정확히 동일한 버전 사양을 사용해야합니다. (0) | 2020.09.29 |
식별 관계와 비 식별 관계의 차이점은 무엇입니까? (0) | 2020.09.29 |
MySQL에서 '존재하지 않는 경우 삽입'하는 방법은 무엇입니까? (0) | 2020.09.29 |