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今天下载可能会提供与昨天或明天下载不同的文件.
通常,快照依赖项应该仅在开发期间存在,并且没有发布的版本(即没有非快照)应该依赖于快照版本.
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可以:
SNAPSHOT版本将作为稳定库处理.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发布过程的一个例子
小智 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/
我想谈一谈术语。其他答案很好地解释了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将寻找该存储库的更新。您还可以使用标签指定更新间隔。
通常在Maven中,我们有两种类型的内部版本1)快照内部版本2)发布内部版本
快照版本:SNAPSHOT是特殊版本,用于指示当前的部署副本与常规版本不同,maven会检查远程存储库中每个版本的版本,因此快照版本不过是开发版本。
发布版本:发行意味着删除该版本的SNAPSHOT,这是常规的版本。