我对Maven Snapshot的含义以及为什么要构建一个它有点困惑?
Maven中的快照版本尚未发布 .
这个想法是 before 发布(或任何其他版本),有一个 1.0-SNAPSHOT . 该版本可能会成为 1.0 . 它基本上是“ 1.0 正在开发中” . 这可能接近真正的 1.0 版本,或者相当远(例如,在 0.9 版本之后) .
1.0-SNAPSHOT
1.0
0.9
"real"版本和快照版本之间的区别在于快照可能会获得更新 . 这意味着今天下载 1.0-SNAPSHOT 可能会提供与昨天或明天下载不同的文件 .
通常,快照依赖项应该在开发期间存在,并且没有发布的版本(即没有非快照)应该依赖于快照版本 .
另外三个答案可以让您对 -SNAPSHOT 版本有一个很好的看法 . 我只是想在发现 SNAPSHOT 依赖时添加一些关于Maven行为的信息 .
-SNAPSHOT
SNAPSHOT
构建应用程序时,Maven将在 local 存储库中搜索依赖项 . 如果在那里找不到稳定版本,它将搜索远程存储库(在 settings.xml 或 pom.xml 中定义)以检索此依赖关系 . 然后,它会将其复制到本地存储库,以使其可用于下一个版本 .
settings.xml
pom.xml
例如, foo-1.0.jar 库被视为 stable 版本,如果Maven在本地存储库中找到它,它将使用此库作为当前版本 .
foo-1.0.jar
现在,如果你需要一个 foo-1.0-SNAPSHOT.jar 库,Maven会知道这个版本不稳定并且可能会有变化 . 这就是为什么Maven会尝试在远程存储库中找到更新版本的原因,即使在本地存储库中找到了该库的一个版本 . 但是,此检查每天只进行一次 . 这意味着如果您在本地存储库中有 foo-1.0-20110506.110000-1.jar (即此库已在2011/05/06 11:00:00生成),并且如果您在同一天再次运行Maven构建,则Maven将 not 检查新版本的存储库 .
foo-1.0-SNAPSHOT.jar
foo-1.0-20110506.110000-1.jar
Maven为您提供了一种可以在存储库定义中更改此更新策略的方法:
<repository> <id>foo-repository</id> <url>...</url> <snapshots> <enabled>true</enabled> <updatePolicy>XXX</updatePolicy> </snapshots> </repository>
XXX 可以是:
XXX
always :Maven将检查每个版本的更新版本;
daily ,默认值;
interval:XXX :以分钟为单位的间隔(XXX)
never :Maven永远不会尝试检索另一个版本 . 只有当它不存在于本地时才会这样做 . 使用该配置, SNAPSHOT 版本将作为稳定库处理 .
(可以找到settings.xml的模型here)
“SNAPSHOT”术语表示构建是给定时间代码的快照 .
这通常意味着这个版本仍处于重大发展阶段 .
当代码准备好并且是时候释放它时,您将需要更改POM中列出的版本 . 然后,您将使用像“1.0”这样的标签而不是“SNAPSHOT” .
有关版本控制的一些帮助,请查看Semantic Versioning specification .
“发布”是版本的最终版本,不会发生变化 .
“快照”是一个构建,可以由具有相同名称的另一个构建替换 . 这意味着构建可能随时发生变化,并且仍处于积极发展阶段 .
基于相同的代码,您有不同构建的不同工件 . 例如 . 你可能有一个调试,一个没有 . 一个用于Java 5.0,一个用于Java 6.通常,只需一个构建即可完成所需的一切 . ;)
Maven版本可以包含字符串文字“SNAPSHOT”,表示项目当前处于活动开发状态 .
例如,如果您的项目具有版本“1.0-SNAPSHOT”并且您将此项目的工件部署到Maven存储库,则如果您要在11部署版本,Maven会将此版本扩展为“1.0-20080207-230803-1” :2008年2月7日下午8点UTC . 换句话说,当您部署快照时,您不会发布软件组件;您将在特定时间发布组件的快照 .
所以主要是快照版本用于正在开发的项目 . 如果您的项目依赖于正在进行开发的软件组件,则可以依赖快照发布,并且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发布过程的一个例子
这是存储库的快照的样子,并且在这种情况下未启用,这意味着此处引用的存储库是稳定的,并且不需要更新 .
<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中我们有两种类型的构建1)快照构建2)发布构建
快照构建:SNAPSHOT是指示当前部署副本不像常规版本的特殊版本,maven会检查远程存储库中每个构建的版本,因此快照构建只是维护构建 .
发布版本:发布意味着在构建版本中删除SNAPSHOT,这些是常规版本 .
7 回答
Maven中的快照版本尚未发布 .
这个想法是 before 发布(或任何其他版本),有一个
1.0-SNAPSHOT
. 该版本可能会成为1.0
. 它基本上是“1.0
正在开发中” . 这可能接近真正的1.0
版本,或者相当远(例如,在0.9
版本之后) ."real"版本和快照版本之间的区别在于快照可能会获得更新 . 这意味着今天下载
1.0-SNAPSHOT
可能会提供与昨天或明天下载不同的文件 .通常,快照依赖项应该在开发期间存在,并且没有发布的版本(即没有非快照)应该依赖于快照版本 .
另外三个答案可以让您对
-SNAPSHOT
版本有一个很好的看法 . 我只是想在发现SNAPSHOT
依赖时添加一些关于Maven行为的信息 .构建应用程序时,Maven将在 local 存储库中搜索依赖项 . 如果在那里找不到稳定版本,它将搜索远程存储库(在
settings.xml
或pom.xml
中定义)以检索此依赖关系 . 然后,它会将其复制到本地存储库,以使其可用于下一个版本 .例如,
foo-1.0.jar
库被视为 stable 版本,如果Maven在本地存储库中找到它,它将使用此库作为当前版本 .现在,如果你需要一个
foo-1.0-SNAPSHOT.jar
库,Maven会知道这个版本不稳定并且可能会有变化 . 这就是为什么Maven会尝试在远程存储库中找到更新版本的原因,即使在本地存储库中找到了该库的一个版本 . 但是,此检查每天只进行一次 . 这意味着如果您在本地存储库中有foo-1.0-20110506.110000-1.jar
(即此库已在2011/05/06 11:00:00生成),并且如果您在同一天再次运行Maven构建,则Maven将 not 检查新版本的存储库 .Maven为您提供了一种可以在存储库定义中更改此更新策略的方法:
XXX
可以是:always :Maven将检查每个版本的更新版本;
daily ,默认值;
interval:XXX :以分钟为单位的间隔(XXX)
never :Maven永远不会尝试检索另一个版本 . 只有当它不存在于本地时才会这样做 . 使用该配置,
SNAPSHOT
版本将作为稳定库处理 .(可以找到settings.xml的模型here)
“SNAPSHOT”术语表示构建是给定时间代码的快照 .
这通常意味着这个版本仍处于重大发展阶段 .
当代码准备好并且是时候释放它时,您将需要更改POM中列出的版本 . 然后,您将使用像“1.0”这样的标签而不是“SNAPSHOT” .
有关版本控制的一些帮助,请查看Semantic Versioning specification .
“发布”是版本的最终版本,不会发生变化 .
“快照”是一个构建,可以由具有相同名称的另一个构建替换 . 这意味着构建可能随时发生变化,并且仍处于积极发展阶段 .
基于相同的代码,您有不同构建的不同工件 . 例如 . 你可能有一个调试,一个没有 . 一个用于Java 5.0,一个用于Java 6.通常,只需一个构建即可完成所需的一切 . ;)
Maven版本可以包含字符串文字“SNAPSHOT”,表示项目当前处于活动开发状态 .
例如,如果您的项目具有版本“1.0-SNAPSHOT”并且您将此项目的工件部署到Maven存储库,则如果您要在11部署版本,Maven会将此版本扩展为“1.0-20080207-230803-1” :2008年2月7日下午8点UTC . 换句话说,当您部署快照时,您不会发布软件组件;您将在特定时间发布组件的快照 .
所以主要是快照版本用于正在开发的项目 . 如果您的项目依赖于正在进行开发的软件组件,则可以依赖快照发布,并且Maven将在您运行构建时定期尝试从存储库下载最新快照 . 同样,如果系统的下一个版本的版本为“1.8”,那么在项目正式发布之前,您的项目将具有“1.8-SNAPSHOT”版本 .
例如,以下依赖项将始终下载spring的最新1.8开发JAR:
Maven
maven发布过程的一个例子
这是存储库的快照的样子,并且在这种情况下未启用,这意味着此处引用的存储库是稳定的,并且不需要更新 .
另一个案例是:
这意味着Maven将查找此存储库的更新 . 您还可以使用标记指定更新的间隔 .
通常在maven中我们有两种类型的构建1)快照构建2)发布构建
快照构建:SNAPSHOT是指示当前部署副本不像常规版本的特殊版本,maven会检查远程存储库中每个构建的版本,因此快照构建只是维护构建 .
发布版本:发布意味着在构建版本中删除SNAPSHOT,这些是常规版本 .