【发布时间】:2011-08-19 13:43:56
【问题描述】:
我对 Maven 快照的含义以及我们为什么要构建一个有点困惑?
【问题讨论】:
标签: java maven dependency-management
我对 Maven 快照的含义以及我们为什么要构建一个有点困惑?
【问题讨论】:
标签: java maven dependency-management
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 版本将作为稳定库处理。(settings.xml的模型可以找到here)
【讨论】:
SNAPSHOT版本:mvn clean package -U按照maven tutorial
-U 标志。由于MNG-4142,它可能无法达到您的预期。
mvn install 将 1.0-SNAPSHOT 版本的 jar 安装到我的本地存储库中。第二天,我对项目进行了更改,但没有更改版本——然后在运行mvn install 时,它似乎没有在我的本地仓库中更改它。这是预期的行为吗?修改后不能重复使用一个版本并用mvn install覆盖它吗?
“SNAPSHOT”术语表示构建是您的代码在给定时间的快照。
这通常意味着这个版本仍在大力开发中。
当代码准备好并且是时候发布它时,您将需要更改 POM 中列出的版本。然后,您可以使用“1.0”之类的标签,而不是“SNAPSHOT”。
如需有关版本控制的帮助,请查看Semantic Versioning specification。
【讨论】:
“发布”是不变版本的最终构建。
“快照”是可以被另一个同名的构建替换的构建。这意味着构建可以随时更改并且仍在积极开发中。
对于基于相同代码的不同构建,您有不同的工件。例如。你可能有一个调试和一个没有。一个用于 Java 5.0,一个用于 Java 6。通常,拥有一个可以满足您所需的一切的构建更简单。 ;)
【讨论】:
Maven 版本可以包含字符串文字“SNAPSHOT”,表示项目当前正在积极开发中。
例如,如果您的项目具有“1.0-SNAPSHOT”版本,并且您将此项目的工件部署到 Maven 存储库, 如果你想,Maven 会将此版本扩展为“1.0-20080207-230803-1” 在 UTC 时间 2008 年 2 月 7 日晚上 11:08 部署一个版本。换句话说,当你 部署快照,您不会发布软件组件;你是 在特定时间发布组件的快照。
因此,快照版本主要用于正在积极开发的项目。 如果您的项目依赖于正在积极开发的软件组件, 您可以依赖快照版本,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,我们可以认为它是一个“发布”版本,但它不是“最终版本”。 Semantic versioning 明确表示-beta.4 之类的东西是“预发布”版本,因此即使没有-SNAPSHOT,将其称为“发布”版本也没有意义。事实上,根据定义,即使-rc.5 也是发布候选,而不是实际发布,尽管我们可能允许公众访问以进行测试。
因此,尽管有 Maven,但在我看来,仅将根本没有任何限定符的“发布”版本称为“发布”版本似乎更合适,甚至没有 -beta.4。也许 Maven 非快照版本的更好名称是“稳定”版本(灵感来自 another answer)。因此我们会有:
1.2.3-beta.4-SNAPSHOT:预发布版本的快照版本。1.2.3-SNAPSHOT:发布版本的快照版本。1.2.3-beta.4:预发布版本的稳定版本。1.2.3:发布版本(显然是稳定的非快照版本)。【讨论】:
快照依赖 快照依赖项是正在开发中的依赖项(JAR 文件)。您可以依赖项目的快照版本,而不是不断更新版本号以获得最新版本。每次构建时,快照版本总是会下载到您的本地存储库中,即使匹配的快照版本已经位于您的本地存储库中。始终下载快照依赖项可确保您在每次构建时始终在本地存储库中拥有最新版本。
你的 pom 包含很多 -SNAPSHOT 依赖项,那些 -SNAPSHOT 依赖项是一个移动目标
https://dzone.com/articles/maven-release-plugin-in-the-enterprise https://javarevisited.blogspot.com/2019/03/top-5-course-to-learn-apache-maven-for.html https://www.mojohaus.org/versions-maven-plugin/examples/lock-snapshots.html http://tutorials.jenkov.com/maven/maven-tutorial.html
【讨论】:
这是仓库快照的样子,在这种情况下没有启用,这意味着这里提到的仓库是稳定的,不需要更新。
<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 builds:SNAPSHOT 是特殊版本,表示当前部署副本不像常规版本,maven 检查远程存储库中每个构建的版本 所以快照构建只不过是开发构建。
Release builds:Release 是指在构建版本中删除 SNAPSHOT,这些是常规构建版本。
【讨论】:
简单的快照意味着它是不稳定的版本。
当版本包含像 1.0.0 这样的快照时 -SNAPSHOT 表示它不是稳定版本并寻找远程存储库来解决依赖关系
【讨论】:
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>
如果您想更好地了解 Maven,您也可以查看这些文章:
【讨论】:
快照只是意味着根据您的配置,Maven 将检查特殊依赖项的最新更改。快照是不稳定的,因为它正在开发中,但是如果在特殊项目上需要进行最新更改,则必须将依赖项版本配置为快照版本。这种情况发生在拥有多种产品的大型组织中,这些产品彼此之间的关系非常密切。
【讨论】:
了解 SDLC 的上下文将有助于了解快照和发布之间的区别。在开发过程中,开发人员都将他们的功能贡献给基线分支。在某个时候,领导认为已经积累了足够的功能,然后他将从基线分支中删除一个发布分支。此时间点之前的任何构建都是快照。到此为止的构建是发布。请注意,如果在发布测试期间发现任何缺陷,发布版本也可能在投入生产之前发生变化。
【讨论】:
顾名思义,快照是指项目在那个时刻的状态及其依赖关系。每当 maven 找到项目的新 SNAPSHOT 时,它都会下载并替换本地存储库中项目的旧 .jar 文件。
快照版本用于正在积极开发的项目。如果您的项目依赖于正在积极开发的软件组件,您可以依赖快照版本,并且 Maven 会在您运行构建时定期尝试从存储库下载最新的快照。
【讨论】: