Maven快照究竟是什么,为什么我们需要它?
Maven中的快照版本是尚未发布的版本。
想法是之前 a 1.0
版本(或任何其他版本)完成后,存在1.0-SNAPSHOT
。该版本是可能会变成1.0
。它基本上是“1.0
正在开发中”。这可能是关闭到真正的1.0
版本,或者很远(例如在0.9
版本之后)。
“真实”版本和快照版本之间的区别在于快照可能会更新。这意味着,今天下载1.0-SNAPSHOT
可能会提供与昨天或明天下载文件不同的文件。
通常,在开发过程中存在快照依赖性只有,并且没有发布版本(即没有非快照)应该对快照版本有依赖性。
“发布”是不改变版本的最终版本。
“快照”是一个可以被具有相同名称的另一个版本替换的版本。这意味着构建可能随时发生变化,并且仍在积极发展中。
根据相同的代码,您对不同的构建有不同的工件。例如。你可能有一个调试,一个没有。一个用于Java 5.0,另一个用于Java 6.通常,更简单的方法是拥有一个可以完成所需任务的构建版本。 ;)
“SNAPSHOT”术语表示构建是给定时间的代码快照。
通常意味着该版本仍处于重大开发阶段。
当需要发布代码时,您需要更改pom中列出的版本。因此,不要使用“SNAPSHOT”,而要使用“1.0”。请参考Semantic Versioning specification。
来讲**语义版本**,-SNAPSHOT版本将作为预发布版本:“_A预发布版本表示版本on是不稳定的,可能无法满足其相关正常版本所表示的预期兼容性要求。示例:1.0.0-alpha,1.0.0-alpha.1,1.0.0-0.3.7,1.0.0-x.7.z.92._“ – avandeursen 2014-03-23 21:15:03
这听起来对我来说就像”SNAPSHOT“不是一个“在特定时间你的代码的快照”,而是“可用代码的最新版本”。如果这是HTTP,这将是一个标志,它说:“不要打扰做一个HEAD,去获取任何东西服务器无论如何“。事实上,它几乎是相反的”代码在给定的时间“。 – lilbyrdie 2015-05-21 14:52:45
其他三个答案为您提供了什么是-SNAPSHOT
版本的良好愿景。我只是想在Maven找到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年5月6日11:00:00生成),并且如果您在同一天再次运行Maven构建,Maven将而不是检查存储库是否有更新的版本。
Maven提供你一个方法,可以在你的仓库定义更改此更新策略:
<repository>
<id>foo-repository</id>
<url>...</url>
<snapshots>
<enabled>true</enabled>
<updatePolicy>XXX</updatePolicy>
</snapshots>
</repository>
其中XXX
可以是:
- 总是:Maven会检查是否有新版本上每一个构建;
- 每天,默认值;
- 间隔:XXX:在分钟的间隔(XXX)
-
从未:Maven将永远不会尝试检索另一个版本。只有在本地不存在的情况下才会这样做。通过配置,
SNAPSHOT
版本将作为稳定库进行处理。
(settings.xml中的模型,可以发现here)
看来有可能使用命令行开关来强制maven重新下载所有的'SNAPSHOT'版本:'mvn clean package -U'[maven tutorial](http://www.tutorialspoint.com/maven/maven_snapshots。 htm) – 2014-03-25 14:38:52
小心使用'-U'标志。由于[MNG-4142](http://jira.codehaus.org/browse/MNG-4142),它可能无法达到你期望的效果。 – 2014-05-05 18:16:06
另外值得一提的是,好的做法要求您在创建发布版本时不使用快照依赖关系,并且实际上如果存在快照依赖关系,则Maven发布插件将失败。 – RCross 2014-07-07 08:29:35
这是一个快照看起来像一个仓库,并在这种情况下,不启用,这意味着在这里所指的仓库是稳定的,有没有必要更新
<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>
WH这意味着Maven会查找此存储库的更新。您也可以为带有标签的更新指定间隔。
通常行家,我们有两种类型的构建 1)快照建立 2)发布版本
1)快照建立:快照是特殊版本,表明当前的部署副本并不像普通版本,Maven的检查每个版本的版本都在远程存储库 中,因此快照构建只是维护构建。
2)发布构建:发布意味着在构建版本中删除SNAPSHOT,这些是常规构建版本。
Maven版本可以包含字符串文字“SNAPSHOT”来表示项目当前处于活动开发状态。例如,如果您的项目具有“1.0-SNAPSHOT”版本,并且您将此项目的工件部署到Maven存储库,那么如果您要将此版本扩展到“1.0-20080207-230803-1” 在2008年2月7日11:08 PM部署发布。换句话说,当你部署一个快照时,你不会发布一个软件组件;您在 在特定时间发布组件的快照。
所以主要是快照版本用于积极开发项目。 如果您的项目依赖于处于活动开发中的软件组件,您可以依赖快照版本,Maven将定期尝试 在运行构建版本时从存储库下载最新的快照。同样,如果 系统的下一个版本将具有版本“1.8”,则在项目正式发布之前,您的项目 将具有“1.8-SNAPSHOT”版本。
例如,下面的依赖会随时下载春天的最新1.8开发JAR:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
<version>1.8-SNAPSHOT”</version>
</dependency>
行家释放过程的一个例子
所以快照总是一个更稳定的版本,我假设。该版本号仅适用于使用哪个版本的工件,而不是一个不同的分支源代码是否正确? – amphibient 2013-10-08 21:54:06
@amphibient:不,快照不一定更稳定:它只是最新的版本。快照_presented_实际版本,它并不在它之后。事实上,版本号码通常不会请参阅分支机构 – avandeursen 2014-03-23 21:05:13
@avandeursen快照不一定具有您声明的语义,您可以拥有“主-SNAPSHOT“,后来发布了1.0版本。它不一定是“FutureVersion-SNAPSHOT”,也不一定在发布之前。其他一切都是正确的 - 它是一个不稳定的参考移动目标,不能依靠产生可重复的构建。 – 2015-05-07 23:18:47