什么是Maven Snapshot,为什么我们需要它?

mei*_*sam 799 java dependency-management maven

我对Maven Snapshot的含义以及为什么要构建一个它有点困惑?

Joa*_*uer 952

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

这个想法是,一个1.0版本(或任何其他版本)完成后,存在一个1.0-SNAPSHOT.那个版本可能会变成 什么样1.0.它基本上是" 1.0正在开发中".这可能接近真正的1.0版本,或者相当远(0.9例如,在发布之后).

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

通常,快照依赖项应该在开发期间存在,并且没有发布的版本(即没有非快照)应该依赖于快照版本.

  • @amphibient:不,快照不一定更稳定:它只是最新版本.快照_precedes_实际发布,它不会在它之后.实际上,版本号通常不涉及分支. (62认同)
  • 我是唯一一个认为 Java 堆栈中的所有内容都有奇怪的名称的人吗?就好像它们是由怪人开发的一样?快照这个词与它所使用的概念根本没有任何关系。Java 世界中的几乎所有东西都有完全垃圾无意义的名称。完全同意@uh_big_mike_boi (9认同)
  • @avandeursen快照不一定具有您声明的语义.您可以拥有"master-SNAPSHOT",然后再发布1.0版本.它不一定是"FutureVersion-SNAPSHOT",也不一定是在发布之前.其他一切都是正确的 - 它是对移动目标的不稳定引用,不能依赖它来产生可重复的构建. (7认同)
  • 他们为什么不能只称其为“ 1.0-DEVELOPMENT”或“ 1.0-INPROGRESS”,为什么人们不得不使用非显而易见的术语 (4认同)
  • 谢谢@ScottCarey。实际上,“通用前面”可能会更加准确,因为甚至无法保证“移动目标”将最终存在。 (3认同)
  • @Sнаđошςа׽:我不太确定你想通过这个咆哮来完成什么。SNAPSHOT 源于这样一个事实:它是持续开发过程中项目状态的“快照”。可能有一个更好的名字,但这并非完全没有意义。 (3认同)
  • @Jay:不,据我所知,无法明确引用特定的快照,它们在设计上是不可寻址/可互换的。如果您需要细粒度的版本控制,那么您应该只发布具有特定版本字符串(-RC1、-RC2 或类似内容)的候选版本。 (2认同)
  • @LuisComS:RC 与快照不同。RC 是发布之前的“特定”版本。`-SNAPSHOT` 建议可以更改的“最新构建版本”。即今天下载“1.0-SNAPSHOT”可能会为您提供与明天“1.0-SNAPSHOT”不同的二进制文件。 (2认同)

Rom*_*las 760

另外三个答案可以让您对-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>
Run Code Online (Sandbox Code Playgroud)

哪里XXX可以:

  • 总是:Maven将检查每个版本的更新版本;
  • 每日,默认值;
  • interval:XXX:以分钟为单位的间隔(XXX)
  • 永远不会:Maven永远不会尝试检索另一个版本.只有当它不存在于本地时才会这样做.使用该配置,SNAPSHOT版本将作为稳定库处理.

(可以在这里找到settings.xml的模型)

  • 小心`-U`标志.由于[MNG-4142](http://jira.codehaus.org/browse/MNG-4142),它可能无法达到您的预期. (3认同)
  • 另外值得一提的是,在创建发布版本时,良好实践要求您不使用快照依赖项,如果存在快照依赖项,Maven Release Plugin确实会失败. (3认同)
  • 似乎有可能使用命令行开关来强制maven重新下载所有的SNAPSHOT版本:按照[maven教程]的`mvn clean package -U`(http://www.tutorialspoint.com/maven/maven_snapshots.htm ) (2认同)
  • 我运行`mvn install`将一个版本1.0-SNAPSHOT的jar安装到我的本地仓库中.第二天我对项目进行了更改,但没有更改版本 - 然后在运行`mvn install`时,它似乎没有在我的本地仓库中更改它.这是预期的行为吗?我可以不重复使用版本并在更改后用`mvn install`覆盖它吗? (2认同)

jjn*_*guy 64

"SNAPSHOT"术语表示构建是给定时间代码的快照.

这通常意味着该版本仍处于重大发展阶段.

当代码准备好并且是时候释放它时,您将需要更改POM中列出的版本.然后,您将使用像"1.0"这样的标签而不是"SNAPSHOT".

有关版本控制的一些帮助,请查看语义版本控制规范.

  • 听起来像"SNAPSHOT"不是"特定时间代码的快照",而是"可用代码的最新版本".如果这是HTTP,它将是一个标志,上面写着"不要打扰做头,无论如何都要去服务器上的任何东西." 实际上,它几乎与"给定时间的代码"完全相反. (3认同)

Pet*_*rey 25

"发布"是版本的最终版本,不会发生变化.

"快照"是一个构建,可以由具有相同名称的另一个构建替换.这意味着构建可能随时发生变化,并且仍处于积极发展阶段.

基于相同的代码,您有不同构建的不同工件.例如,你可能有一个调试,一个没有.一个用于Java 5.0,一个用于Java 6.通常,只需一个构建即可完成所需的一切.;)


Job*_*ews 18

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>
Run Code Online (Sandbox Code Playgroud)

Maven的

maven发布过程的一个例子

在此输入图像描述


小智 10

Maven SNAPSHOT 是由 Maven 构建创建的工件,旨在为软件开发周期中的开发人员提供帮助。SNAPSHOT 是一个工件(或项目构建结果),不会假装在任何地方使用,它只是临时的 .jar、ear...,为了测试构建过程或测试尚未准备就绪的新需求而创建到生产环境。当您对 SNAPSHOT 工件质量感到满意后,您可以创建一个可供其他项目使用或可以自行部署的 RELEASE 工件。

在您的项目中,您可以使用 Maven 的 pom.xml 文件中的 version 元素定义 SNAPSHOT:

<groupId>example.project.maven</groupId>
<artifactId>MavenEclipseExample</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<description>Maven pom example</description>
Run Code Online (Sandbox Code Playgroud)

如果您想更好地了解 Maven,您也可以查看这些文章:

https://connected2know.com/programming/menu-maven-articles/

  • @BlakeNeal 用户 tagus 可能不是以英语为母语的人(可能他是以西班牙语为母语),当他实际上想说“旨在帮助开发人员”时,他错误地使用了“假装”一词:可能的含义之一西班牙语中“伪装者”一词的意思是“瞄准”:https://translate.google.com/?sl=en&amp;tl=es&amp;text=aim&amp;op=translate (8认同)

Gar*_*son 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:发行版本(显然是稳定的非快照版本)。


小智 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>
Run Code Online (Sandbox Code Playgroud)

另一种情况是:

<snapshots>
        <enabled>true</enabled>
</snapshots>
Run Code Online (Sandbox Code Playgroud)

这意味着Maven将寻找该存储库的更新。您还可以使用标签指定更新间隔。


Ven*_*ala 5

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

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

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