Maven快照到底是什么,为什么我们需要它?


Answers:


1012

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

这个想法是,一个1.0版本(或任何其他版本)完成后,存在一个1.0-SNAPSHOT。那个版本可能会变成 1.0。它基本上是“ 1.0正在开发中”。这可能接近实际1.0发行版,也可能相当遥远(0.9例如,发行版发行后)。

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

通常,快照依赖关系应在开发期间存在,并且任何发行版本(即,非非快照)都不应依赖快照版本。


67
@amphibient:没有,快照是不是一定更稳定:它仅仅是最新版本。快照于实际发行版,而不在实际发行版之后。实际上,版本号通常不引用分支。
avandeursen 2014年

9
@avandeursen快照不一定具有您要求的语义。您可以拥有“ master-SNAPSHOT”,然后再发布1.0版。它不一定必须是“ FutureVersion-SNAPSHOT”,也不一定要在发行版之前。但是,其他所有内容都是正确的-它是对移动目标的不稳定参考,不能依赖于生成可重复的构建。
Scott Carey 2015年

3
谢谢@ScottCarey。实际上,“通用前面”可能会更加准确,因为甚至无法保证“移动目标”将最终存在。
avandeursen,2015年

1
@Jay:不,据我所知,没有办法明确引用特定的SNAPSHOT,它们在设计上是不可寻址/可互换的。如果需要细粒度的版本控制,则应仅发布具有特定版本字符串(-RC1,-RC2或类似名称)的候选版本。
Joachim Sauer

14
他们为什么不能只称其为“ 1.0-DEVELOPMENT”或类似“ 1.0-INPROGRESS”,为什么人们不得不使用非显而易见的术语
uh_big_mike_boi

791

其他三个答案为您提供了-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的模型可以在这里找到


2
似乎可以使用命令行开关强制maven重新下载所有SNAPSHOT版本:mvn clean package -U根据maven教程
Dimitry K 2014年

3
小心-U标志。由于MNG-4142,它可能无法满足您的期望。
凯文·克罗斯

3
还值得一提的是,良好实践要求您在创建发行版本时不使用任何快照依赖项,并且如果存在快照依赖项,则Maven发行插件确实会失败。
RCross

2
我跑去mvn install在我的本地仓库中安装了一个1.0-SNAPSHOT版本的jar。第二天,我对项目进行了更改,但没有更改版本-然后运行时mvn install,似乎没有在我的本地仓库中更改它。那是预期的行为吗?mvn install更改版本后,是否可以不重用版本并将其覆盖?
Don Cheadle 2014年

1
@mmcrae AFAIK应该更新。那就是安装目标的作用,更新本地SNAPSHOT jar。你发现了别的东西吗?
约翰尼,2016年

73

“ SNAPSHOT”一词意味着该构建是给定时间的代码快照。

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

代码准备就绪并可以发布时,您将需要更改POM中列出的版本。然后使用“ 1.0”之类的标签代替“ SNAPSHOT”。

对于版本控制方面的帮助,请查看语义版本控制规范


语义版本方面,-SNAPSHOT发行版将是预发行版:“发行前版本表示该版本不稳定,并且可能无法满足其关联的正常版本所表示的预期兼容性要求。示例:1.0.0 -alpha,1.0.0-alpha.1、1.0.0-0.3.7、1.0.0-x.7.z.92。
avandeursen 2014年

3
在我看来,“ SNAPSHOT”不是“特定时间的代码快照”,而是“可用的最新版本的代码”。如果这是HTTP,它将是一个标志,上面写着:“不要费心做HEAD,无论如何都要获取服务器上的所有内容。” 确实,这几乎与“给定时间的代码”相反。
lilbyrdie 2015年

什么是“重”发展?
Joker

1
@Joker“沉重”是很多事情都在变化的地方(新功能,重构等)
罗伯特

28

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

“快照”是可以用另一个具有相同名称的版本替换的版本。这意味着该构建可以随时更改,并且仍在积极开发中。

对于基于同一代码的不同构建,您具有不同的工件。例如,您可能有一个带有调试功能,一个没有调试功能。一个用于Java 5.0,一个用于Java6。通常,拥有一个可以满足您所有需求的构建比较简单。;)


21

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发布过程的一个例子

在此处输入图片说明


6

我想谈一谈术语。其他答案则很好地解释了Maven上下文中的“快照”版本。但是,是否应该将非快照版本称为“发行”版本呢?

“发行”版本的语义版本控制思想之间存在某种张力,该版本似乎是没有限定符的任何版本,-SNAPSHOT但也没有限定符的版本-beta.4;和Maven的“发行”版本的想法,其中似乎仅包含-SNAPSHOT

换句话说,“发布”是指“我们可以将其发布到Maven Central”还是“该软件已最终发布给公众”,这在语义上是模棱两可的。-beta.4如果我们向公众发布它,我们可以认为它是“发布”版本,但它不是“最终发布”。语义版本控制清楚地表明,类似的东西-beta.4是“预发行”版本,因此即使没有,将其称为“发行”版本也没有意义-SNAPSHOT。实际上,根据定义,即使我们允许公众访问进行测试,它甚至-rc.5候选版本,而不是实际版本。

因此,尽管如此,我认为Maven似乎更合适的是只调用一个根本没有任何限定词的“发布”版本,甚至没有-beta.4。对于Maven非快照版本,更好的名称可能是“稳定”版本(受另一个答案的启发)。因此,我们将有:

  • 1.2.3-beta.4-SNAPSHOT:预发行版本的快照版本。
  • 1.2.3-SNAPSHOT:发行版的快照版本。
  • 1.2.3-beta.4:预发行版本的稳定版本。
  • 1.2.3:发行版本(显然是稳定的非快照版本)。

您是否了解有关Maven如何处理构建元数据或预发布命名约定的信息?我的意思是,我们都知道阿尔法先于Beta,但行家知道吗?即使以1.2.3-beta.4作为稳定版本,它是否至少知道1.2.3之后呢?
DGoiko

5

这就是存储库快照的外观,在这种情况下未启用快照,这意味着此处引用的存储库是稳定的,不需要更新。

<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将寻找该存储库的更新。您还可以使用标签指定更新间隔。


5

通常在Maven中,我们有两种类型的内部版本1)快照内部版本2)发布内部版本

  1. 快照版本:SNAPSHOT是特殊版本,用于指示当前的部署副本与常规版本不同,maven会检查远程存储库中每个版本的版本,因此快照版本不过是开发版本。

  2. 发布版本:发行意味着删除该版本的SNAPSHOT,这是常规的版本。



1

了解SDLC的上下文将有助于了解快照和发行版之间的区别。在开发过程中,开发人员都将其功能贡献给基准分支。主管在某个时候认为已经积累了足够的功能,那么他将从基准分支中删除发布分支。在此时间点之前的所有构建都是快照。到此为止的构建都是发行版。需要注意的是,如果在发布测试期间发现任何缺陷,则发布版本在投入生产之前也可能会发生变化。


1

快照仅表示根据您的配置,Maven将检查特殊依赖项上的最新更改。快照不稳定,因为它正在开发中,但是如果在特殊项目上需要进行最新更改,则必须将依赖项版本配置为快照版本。在具有多个产品的大型组织中会发生这种情况,这些产品之间的联系非常紧密。


0

顾名思义,快照是指当时项目的状态及其依赖项。只要maven找到项目的较新版本SNAPSHOT,它就会下载并替换本地存储库中项目的较旧.jar文件。

快照版本用于活动开发中的项目。如果您的项目依赖于正在开发中的软件组件,则可以依赖快照发行版,并且在运行构建时,Maven将定期尝试从存储库下载最新的快照。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.