什么是Maven Snapshot,为什么我们需要它?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是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
可以是:
- 总是:Maven将检查每个版本的更新版本;
- 每日,默认值;
- interval:XXX:以分钟为单位的间隔(XXX)
- 永远不会:Maven永远不会尝试检索另一个版本。只有当它不存在于本地时才会这样做。通过配置,
SNAPSHOT
版本将作为稳定库处理。
(settings.xml的模型可以找到here)
“SNAPSHOT”术语表示构建是给定时间代码的快照。
这通常意味着该版本仍处于重大发展阶段。
当代码准备好并且是时候释放它时,您将需要更改POM中列出的版本。然后,您将使用像“1.0”这样的标签而不是“SNAPSHOT”。
有关版本控制的一些帮助,请查看Semantic Versioning specification。
“发布”是版本的最终版本,不会发生变化。
“快照”是一个构建,可以由具有相同名称的另一个构建替换。这意味着构建可能随时发生变化,并且仍在积极开发中。
基于相同的代码,您有不同构建的不同工件。例如。你可能有一个调试,一个没有。一个用于Java 5.0,一个用于Java 6.通常,只需一个构建即可完成所需的一切。 ;)
Maven版本可以包含字符串文字“SNAPSHOT”,表示项目当前处于活动开发状态。
例如,如果您的项目的版本为“1.0-SNAPSHOT”,并且您将此项目的工件部署到Maven存储库,那么如果您要在11版本部署版本,Maven会将此版本扩展为“1.0-20080207-230803-1”。 :UTC时间2008年2月7日晚上8点。换句话说,在部署快照时,您不会发布软件组件;您正在特定时间发布组件的快照。
所以主要是快照版本用于正在开发的项目。如果您的项目依赖于正在进行开发的软件组件,则可以依赖快照发布,并且Maven将在您运行构建时定期尝试从存储库下载最新快照。同样,如果系统的下一个版本的版本为“1.8”,那么在项目正式发布之前,您的项目将具有“1.8-SNAPSHOT”版本。
例如,以下依赖项将始终下载spring的最新1.8开发JAR:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
<version>1.8-SNAPSHOT”</version>
</dependency>
maven发布过程的一个例子
这就是存储库的快照的样子,并且在这种情况下未启用,这意味着此处引用的存储库是稳定的,不需要更新。
<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将查找此存储库的更新。您还可以使用标记指定更新的间隔。
我想谈谈术语。其他答案很好地解释了Maven环境中“快照”版本的含义。但是,是否应该将非快照版本称为“发布”版本?
“发布”版本的语义版本化概念之间存在一些紧张关系,这似乎是任何没有-SNAPSHOT
等限定符的版本,但也没有像-beta.4
这样的限定符;和Maven关于“发布”版本的想法,这似乎只包括没有-SNAPSHOT
。
换句话说,“释放”是否意味着“我们可以将其发布到Maven Central”或“软件是否向公众发布最终版本”存在语义歧义。如果我们将它发布给公众,我们可以认为-beta.4
是一个“发布”版本,但它不是“最终版本”。 Semantic versioning清楚地说像-beta.4
这样的东西是一个“预发布”版本,所以即使没有-SNAPSHOT
,它被称为“发布”版本也没有意义。实际上,根据定义,即使我们可能允许公共访问进行测试,即使-rc.5
是候选版本,也不是实际版本。
所以Maven尽管如此,在我看来,似乎更合适的只是称一个没有任何限定符的“发布”版本,甚至-beta.4
。对于Maven非快照版本来说,更好的名称可能是“稳定”版本(受another answer启发)。因此我们会:
1.2.3-beta.4-SNAPSHOT
:预发布版本的快照版本。1.2.3-SNAPSHOT
:发布版本的快照版本。1.2.3-beta.4
:预发布版本的稳定版本。1.2.3
:发布版本(显然是一个稳定的非快照版本)。
通常在maven中我们有两种类型的构建1)快照构建2)发布构建
- 快照构建:SNAPSHOT是指示当前部署副本不像常规版本的特殊版本,maven会检查远程存储库中每个构建的版本,因此快照构建只是开发构建。
- 发布版本:发布意味着在构建版本中删除SNAPSHOT,这些是常规版本。
了解SDLC的上下文将有助于理解快照和发布之间的区别。在开发过程中,开发人员都将其功能贡献给基线分支。在某些时候,领导认为已经累积了足够的特征,然后他将从基线分支中删除一个发布分支。此时间点之前的任何构建都是快照。到目前为止构建的帖子是发布。需要注意的是,如果在发布测试期间出现任何缺陷点,发布版本在生产之前也会发生变化。
以上是关于什么是Maven Snapshot,为什么我们需要它?的主要内容,如果未能解决你的问题,请参考以下文章
使用 IVY 将 SNAPSHOT 工件发布到 Maven - 有啥魔力?
maven RELEASE 或 SNAPSHOT 版本号有啥规则吗?
maven中snapshot快照库和release发布库的区别和作用
maven snapshot和release版本的区别(转)