2011-05-05 166 views

回答

681

Maven中的快照版本是尚未发布的版本。

想法是之前 a 1.0版本(或任何其他版本)完成后,存在1.0-SNAPSHOT。该版本是可能会变成1.0。它基本上是“1.0正在开发中”。这可能是关闭到真正的1.0版本,或者很远(例如在0.9版本之后)。

“真实”版本和快照版本之间的区别在于快照可能会更新。这意味着,今天下载1.0-SNAPSHOT可能会提供与昨天或明天下载文件不同的文件。

通常,在开发过程中存在快照依赖性只有,并且没有发布版本(即没有非快照)应该对快照版本有依赖性。

+0

所以快照总是一个更稳定的版本,我假设。该版本号仅适用于使用哪个版本的工件,而不是一个不同的分支源代码是否正确? – amphibient 2013-10-08 21:54:06

+29

@amphibient:不,快照不一定更稳定:它只是最新的版本。快照_presented_实际版本,它并不在它之后。事实上,版本号码通常不会请参阅分支机构 – avandeursen 2014-03-23 21:05:13

+4

@avandeursen快照不一定具有您声明的语义,您可以拥有“主-SNAPSHOT“,后来发布了1.0版本。它不一定是“FutureVersion-SNAPSHOT”,也不一定在发布之前。其他一切都是正确的 - 它是一个不稳定的参考移动目标,不能依靠产生可重复的构建。 – 2015-05-07 23:18:47

18

“发布”是不改变版本的最终版本。

“快照”是一个可以被具有相同名称的另一个版本替换的版本。这意味着构建可能随时发生变化,并且仍在积极发展中。

根据相同的代码,您对不同的构建有不同的工件。例如。你可能有一个调试,一个没有。一个用于Java 5.0,另一个用于Java 6.通常,更简单的方法是拥有一个可以完成所需任务的构建版本。 ;)

50

“SNAPSHOT”术语表示构建是给定时间的代码快照。

通常意味着该版本仍处于重大开发阶段。

当需要发布代码时,您需要更改pom中列出的版本。因此,不要使用“SNAPSHOT”,而要使用“1.0”。请参考Semantic Versioning specification

+0

来讲**语义版本**,-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

+0

这听起来对我来说就像”SNAPSHOT“不是一个“在特定时间你的代码的快照”,而是“可用代码的最新版本”。如果这是HTTP,这将是一个标志,它说:“不要打扰做一个HEAD,去获取任何东西服务器无论如何“。事实上,它几乎是相反的”代码在给定的时间“。 – lilbyrdie 2015-05-21 14:52:45

640

其他三个答案为您提供了什么是-SNAPSHOT版本的良好愿景。我只是想在Maven找到SNAPSHOT依赖关系时添加一些关于Maven行为的信息。

当您构建应用程序时,Maven将搜索本地存储库中的依赖关系。如果没有找到稳定版本,它将搜索远程存储库(在settings.xmlpom.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)

+1

看来有可能使用命令行开关来强制maven重新下载所有的'SNAPSHOT'版本:'mvn clean package -U'[maven tutorial](http://www.tutorialspoint.com/maven/maven_snapshots。 htm) – 2014-03-25 14:38:52

+3

小心使用'-U'标志。由于[MNG-4142](http://jira.codehaus.org/browse/MNG-4142),它可能无法达到你期望的效果。 – 2014-05-05 18:16:06

+3

另外值得一提的是,好的做法要求您在创建发布版本时不使用快照依赖关系,并且实际上如果存在快照依赖关系,则Maven发布插件将失败。 – RCross 2014-07-07 08:29:35

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> 

WH这意味着Maven会查找此存储库的更新。您也可以为带有标签的更新指定间隔。

1

通常行家,我们有两种类型的构建 1)快照建立 2)发布版本

1)快照建立:快照是特殊版本,表明当前的部署副本并不像普通版本,Maven的检查每个版本的版本都在远程存储库 中,因此快照构建只是维护构建。

2)发布构建:发布意味着在构建版本中删除SNAPSHOT,这些是常规构建版本。

4

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> 

Maven

行家释放过程的一个例子

enter image description here