什么是Maven快照,为什么我们需要它?
我对Maven快照的含义有些困惑,为什么我们要创build一个呢?
Maven中的快照版本是尚未发布的版本。
这个想法是, 在 1.0
版本(或任何其他版本)完成之前,存在一个1.0-SNAPSHOT
。 该版本可能会变成 1.0
。 它基本上是“ 1.0
正在开发中”。 这可能接近真正的1.0
版本,或者相当远(例如在0.9
版本之后)。
“真实”版本和快照版本之间的区别在于快照可能会得到更新。 这意味着今天下载1.0-SNAPSHOT
可能会给出与昨天或明天下载文件不同的文件。
通常情况下,快照依赖关系应该只在开发过程中存在,并且没有发布版本(即没有非快照)应该对快照版本有依赖性。
其他三个答案为您提供了一个很好的-SNAPSHOT
,看看一个-SNAPSHOT
版本是什么。 我只是想在MavenfindSNAPSHOT
依赖时添加一些关于Maven行为的信息。
在构build应用程序时,Maven将在本地存储库中search依赖项。 如果没有find稳定的版本,它将search远程存储库(在settings.xml
或pom.xml
定义)来检索这个依赖关系。 然后,它会将其复制到本地存储库,以供下一个版本使用。
例如,一个foo-1.0.jar
库被认为是一个稳定的版本,如果Maven在本地版本库中find它,它将会使用这个版本作为当前版本。
现在,如果你需要一个foo-1.0-SNAPSHOT.jar
库,Maven将知道这个版本不稳定,并且可能会有所变化。 这就是为什么Maven会尝试在远程存储库中查找更新的版本,即使在本地存储库中find了该库的一个版本。 但是,这种检查每天只进行一次。 这意味着如果你在本地仓库中有一个foo-1.0-20110506.110000-1.jar
(即这个库已经在2011/05/06 11:00:00生成),并且如果你再次运行Maven构build,同一天,Maven将不会检查存储库是否有更新的版本。
Maven为您提供了一种在存储库定义中更改此更新策略的方法:
<repository> <id>foo-repository</id> <url>...</url> <snapshots> <enabled>true</enabled> <updatePolicy>XXX</updatePolicy> </snapshots> </repository>
其中XXX
可以是:
- 总是 :Maven会检查每个版本的更新版本;
- 每日 ,默认值;
- 间隔:XXX :以分钟为单位的时间间隔(XXX)
- 永远不会 :Maven永远不会尝试检索另一个版本。 只有在本地不存在的情况下才会这样做。 通过configuration,
SNAPSHOT
版本将作为稳定库进行处理。
(可以在这里findsettings.xml的模型)
“SNAPSHOT”术语表示构build是给定时间的代码快照。
这通常意味着该版本仍处于重大的发展阶段。
当需要发布你的代码的时候,你需要更改pom中列出的版本。 所以不是有一个“SNAPSHOT”你会有像“1.0”的东西。
有关版本控制的一些帮助,请查看语义版本控制规范 。
“发布”是不改变版本的最终版本。
“快照”是一个可以被具有相同名称的另一个版本replace的版本。 这意味着build筑可以随时改变,并且仍在积极发展。
基于相同的代码,您可以为不同的构build创build不同的工件。 例如,你可能有一个debugging和一个没有。 一个用于Java 5.0,另一个用于Java 6.一般来说,更简单的是拥有一个可以完成所有工作的构build版本。 ;)
这就是存储库的快照,在这种情况下没有启用,这意味着这里提到的存储库是稳定的,不需要更新。
<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将查找此存储库的更新。 您也可以使用标签指定更新间隔。
通常在maven我们有两种types的构build1)快照构build2)发布构build
1)快照构build:SNAPSHOT是指示当前部署副本不像常规版本的特殊版本,maven检查远程存储库中每个构build的版本,因此快照构build只是维护构build。
2)发布构build:发布意味着在构build版本中删除SNAPSHOT,这是常规构build版本。
Maven版本可以包含一个string文字“SNAPSHOT”来表示一个项目目前正在开发中。
例如,如果您的项目具有“1.0-SNAPSHOT”版本,并且将此项目的构件部署到Maven存储库,那么如果您想在11版本中部署版本,Maven会将此版本扩展到“1.0-20080207-230803-1” :2008年2月7日08点08。 换句话说,当你部署一个快照时,你并没有发布一个软件组件。 您将在特定时间发布组件的快照。
所以主要的快照版本被用于正在积极开发的项目。 如果您的项目依赖于处于活动开发阶段的软件组件,则可以依赖快照版本,Maven将在运行构build时定期尝试从存储库下载最新的快照。 同样,如果您的系统的下一个版本将要有一个版本“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发布过程的一个例子