理解Maven中的SNAPSHOT版本和正式版本

Maven中建立的依赖管理方式基本已成为Java语言依赖管理的事实标准,Maven的替代者Gradle也基本沿用了Maven的依赖管理机制。在Maven依赖管理中,唯一标识一个依赖项是由该依赖项的三个属性构成的,分别是groupId、artifactId以及version。这三个属性可以唯一确定一个组件(Jar包或者War包)。

其实在Nexus仓库中,一个仓库一般分为public(Release)仓和SNAPSHOT仓,前者存放正式版本,后者存放快照版本。如果在项目配置文件中(无论是build.gradle还是pom.xml)指定的版本号带有’-SNAPSHOT’后缀,比如版本号为’Junit-4.10-SNAPSHOT’,那么打出的包就是一个快照版本。

快照版本和正式版本的主要区别在于,本地获取这些依赖的机制有所不同。假设你依赖一个库的正式版本,构建的时候构建工具会先在本次仓库中查找是否已经有了这个依赖库,如果没有的话才会去远程仓库中去拉取。所以假设你发布了Junit-4.10.jar到了远程仓库,有一个项目依赖了这个库,它第一次构建的时候会把该库从远程仓库中下载到本地仓库缓存,以后再次构建都不会去访问远程仓库了。所以如果你修改了代码,向远程仓库中发布了新的软件包,但仍然叫Junit-4.10.jar,那么依赖这个库的项目就无法得到最新更新。你只有在重新发布的时候升级版本,比如叫做Junit-4.11.jar,然后通知依赖该库的项目组也修改依赖版本为Junit-4.11,这样才能使用到你最新添加的功能。

这种方式在团队内部开发的时候会变的特别蛋痛。假设有两个小组负责维护两个组件,example-service和example-ui,其中example-ui项目依赖于example-service。而这两个项目每天都会构建多次,如果每次构建你都要升级example-service的版本,那么你会疯掉。这个时候SNAPSHOT版本就派上用场了。每天日常构建时你可以构建example-service的快照版本,比如example-service-1.0-SNAPSHOT.jar,而example-ui依赖该快照版本。每次example-ui构建时,会优先去远程仓库中查看是否有最新的example-service-1.0-SNAPSHOT.jar,如果有则下载下来使用。即使本地仓库中已经有了example-service-1.0-SNAPSHOT.jar,它也会尝试去远程仓库中查看同名的jar是否是最新的。有的人可能会问,这样不就不能充分利用本地仓库的缓存机制了吗?别着急,Maven比我们想象中的要聪明。在配置Maven的Repository的时候中有个配置项,可以配置对于SNAPSHOT版本向远程仓库中查找的频率。频率共有四种,分别是always、daily、interval、never。当本地仓库中存在需要的依赖项目时,always是每次都去远程仓库查看是否有更新,daily是只在第一次的时候查看是否有更新,当天的其它时候则不会查看;interval允许设置一个分钟为单位的间隔时间,在这个间隔时间内只会去远程仓库中查找一次,never是不会去远程仓库中查找(这种就和正式版本的行为一样了)。

Maven版本的配置方式为:

1
2
3
4
5
6
7
8
<repository>
    <id>myRepository</id>
    <url>...</url>
    <snapshots>
        <enabled>true</enabled>
        <updatePolicy>XXX</updatePolicy>
    </snapshots>
</repository>

其中updatePolicy就是那4种类型之一。如果配置间隔时间更新,可以写作interval:XX(XX是间隔分钟数)。daily配置是默认值。

而在Gradle,可以设置本地缓存的更新策略。

1
2
3
4
5
6
configurations.all {

// check for updates every build
resolutionStrategy.cacheChangingModulesFor  0,'seconds'

}

当然也可以按照分钟或者小时来设置.

1
2
3
4
5
configurations.all {

resolutionStrategy.cacheChangingModulesFor  10, ‘minutes'

}
1
2
3
4
5
configurations.all {

resolutionStrategy.cacheChangingModulesFor  4, ‘hours'

}

所以一般在开发模式下,我们可以频繁的发布SNAPSHOT版本,以便让其它项目能实时的使用到最新的功能做联调;当版本趋于稳定时,再发布一个正式版本,供正式使用。当然在做正式发布时,也要确保当前项目的依赖项中不包含对任何SNAPSHOT版本的依赖,保证正式版本的稳定性。

时间: 2024-07-30 02:37:46

理解Maven中的SNAPSHOT版本和正式版本的相关文章

maven快照版本和发布版本

   在使用maven过程中,我们在开发阶段经常性的会有很多公共库处于不稳定状态,随时需要修改并发布,可能一天就要发布一次,遇到bug时,甚至一天要发布N次.我们知道,maven的依赖管理是基于版本管理的,对于发布状态的artifact,如果版本号相同,即使我们内部的镜像服务器上的组件比本地新,maven也不会主动下载的.如果我们在开发阶段都是基于正式发布版本来做依赖管理,那么遇到这个问题,就需要升级组件的版本号,可这样就明显不符合要求和实际情况了.但是,如果是基于快照版本,那么问题就自热而然的

Maven 中的pom.xml文件

Maven中的Pom.xml文件解析 项目管理利器(Maven)--Pom.xml解析 <name>项目的描述名</name> <url>项目的地址</url> <description>项目描述</description> <developers>开发人员信息</developers> <licenses>许可证信息</licenses> <!-- 依赖列表 --> <

virtualbox-VirtualBox安装Ubuntu中使用make sanity报ant版本错误!

问题描述 VirtualBox安装Ubuntu中使用make sanity报ant版本错误! 环境:VirtualBox里的Ubuntu 目的:打算深入理解JAVA虚拟机,编译JDK. 实际操作:搭好环境并且装完对应依赖后,基于OpenJDK7u4打算进行编译.用make sanity后报错: ERROR: The version of ant being used is older than the required version of '1.7.1'. The version of ant

如何理解 JavaScript 中的 Promise 机制

本文讲的是如何理解 JavaScript 中的 Promise 机制, Promise 的世界 原生 Promises 是在 ES2015 对 JavaScript 做出最大的改变.它的出现消除了采用 callback 机制的很多潜在问题,并允许我们采用近乎同步的逻辑去写异步代码. 可以说 promises 和 generators ,代表了异步编程的新标准.不论你是否用它,你都得 必须 明白它们究竟是什么. Promise 提供了相当简单的 API ,但也增加了一点学习曲线.如果你以前从没见过

深入理解Python中的ThreadLocal变量(下)

在上篇我们看到了 ThreadLocal 变量的简单使用,中篇对python中 ThreadLocal 的实现进行了分析,但故事还没有结束.本篇我们一起来看下Werkzeug中ThreadLocal的设计. Werkzeug 作为一个 WSGI 工具库,由于一些方面的考虑,并没有直接使用python内置的ThreadLocal类,而是自己实现了一系列Local类.包括简单的Local,以及在此基础上实现的LocalStack,LocalManager 和 LocalProxy.接下来我们一起来看

如何理解android中的api level

问题描述 如何理解android中的api level 刚开始是api level 1 现在api level 多少了 是不是随着android版本的更新而不断的更新 解决方案 可以查看android api的官网,http://source.android.com/source/build-numbers.html level是会随版本更新的,现在都二十几了,应该是23了吧 解决方案二: http://blog.csdn.net/nihaoqiulinhe/article/details/50

Maven中测试插件(surefire)的相关配置及常用方法

原创文章,版权所有,允许转载,标明出处:http://blog.csdn.net/wanghantong 1. 在Maven中配置测试插件surefire <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.17</version> </plugin

Phpwind 8.7 正式版本发布 “立体化”社区迈入云时代

中介交易 SEO诊断 淘宝客 云主机 技术大厅 9月13日,php论坛程序phpwind 8.7正式版于当日下午4时发布. 阿里巴巴旗下通用型建站软件与服务提供商phpwind官方在此前已经发布beta版本,经过一段时间内的公测,汲取广大站长意见,官方对beta版本做了进一步改进完善,在此基础之上发布了正式版本. 此次发布的8.7版本较此前的8.5版本功能改进多达500余项,新版本从"提高社区互动"与"加速内容传递"两个方向进行深耕优化,重点解决目前社区用户的弱关系

如何理解编程中最没用的东西是源代码,最有用的东西是算法和数据结构

问题描述 如何理解编程中最没用的东西是源代码,最有用的东西是算法和数据结构 编程中最没用的东西是源代码,最有用的东西是算法和数据结构 举个简单的算法和数据结构瞧瞧,谢谢 解决方案 这是胡扯,那微软的windows为什么不开源?说源代码没用的,把你的代码都开源啊. 解决方案二: 任何话都有上下文.这里不过是说,对于一个学习编程的人来说,学明白算法再看代码,比在你不懂算法的前提下看人家的代码有效率的多. 好比学习舞蹈,你需要的是学习分解动作,而不是直接模仿人家的姿势. 解决方案三: 算法和数据结构是