Answers:
Maven中的快照版本尚未发布。
这个想法是,前一个1.0
版本(或任何其他版本)完成后,存在一个1.0-SNAPSHOT
。那个版本可能会变成 1.0
。它基本上是“ 1.0
正在开发中”。这可能接近实际1.0
发行版,也可能相当遥远(0.9
例如,发行版发行后)。
“真实”版本和快照版本之间的区别在于快照可能会得到更新。这意味着1.0-SNAPSHOT
今天下载的文件可能不同于昨天或明天下载的文件。
通常,快照依赖关系仅应在开发期间存在,并且任何发行版本(即,非非快照)都不应依赖快照版本。
1.0-DEVELOPMENT
”或类似“ 1.0-INPROGRESS
”,为什么人们不得不使用非显而易见的术语
其他三个答案为您提供了-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
可以在哪里:
SNAPSHOT
版本将作为稳定库处理。mvn install
在我的本地仓库中安装了一个1.0-SNAPSHOT版本的jar。第二天,我对项目进行了更改,但没有更改版本-然后运行时mvn install
,似乎没有在我的本地仓库中更改它。那是预期的行为吗?mvn install
更改版本后,是否可以不重用版本并将其覆盖?
“ SNAPSHOT”一词意味着该构建是给定时间的代码快照。
通常,这意味着该版本仍处于开发阶段。
代码准备就绪并可以发布时,您将需要更改POM中列出的版本。然后使用“ 1.0”之类的标签代替“ SNAPSHOT”。
对于版本控制方面的帮助,请查看语义版本控制规范。
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发布过程的一个例子
我想谈一谈术语。其他答案则很好地解释了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
:发行版本(显然是稳定的非快照版本)。这就是存储库快照的外观,在这种情况下未启用快照,这意味着此处引用的存储库是稳定的,不需要更新。
<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将寻找该存储库的更新。您还可以使用标签指定更新间隔。
只是快照意味着它是不稳定的版本。
当版本包含快照(如1.0.0)时-SNAPSHOT表示该版本不是稳定版本,请查找远程存储库以解决依赖关系
快照仅表示根据您的配置,Maven将检查特殊依赖项上的最新更改。快照不稳定,因为它正在开发中,但是如果在特殊项目上需要进行最新更改,则必须将依赖项版本配置为快照版本。在具有多个产品的大型组织中会发生这种情况,这些产品之间的联系非常紧密。
顾名思义,快照是指当时项目的状态及其依赖项。只要maven找到项目的较新版本SNAPSHOT,它就会下载并替换本地存储库中项目的较旧.jar文件。
快照版本用于活动开发中的项目。如果您的项目依赖于正在开发中的软件组件,则可以依赖快照发行版,并且在运行构建时,Maven将定期尝试从存储库下载最新的快照。