一、背景

  现在主流的Java系的互联网公司里,绝大多数公司都使用Maven作为依赖管理工具,一般我们对于依赖的版本号,常见两种类型:一种以“-RELEASE”结尾,另一种以“-SNAPSHOT”结尾。你别看这一个小小差别,在这里面可是隐藏着巨大的秘密:我们在团队协作开发的时候,如果依赖版本号的命名不是很规范的话,往往你会发现一种现象,那就是别人更新了一个依赖,已经提交到了私服上,但是你本地死活拉不下来,最后没有办法,你选择了直接删除本地仓库中的该版本的依赖,然后就完美解决了。但你有没有想一想为什么会出现这种情况?有没有更高效的解决办法?那么本文我们就聊这个。

二、原理以及解决办法

  在企业的私服中,会存在snapshot快照仓库和release发布仓库,snapshot快照仓库用于保存开发过程中的不稳定版本,release正式仓库则是用来保存稳定的发行版本。

  maven会根据模块的版本号(pom文件中的version)中是否带有“-SNAPSHOT”(注意这里必须是全部大写)来判断是快照版本还是正式版本。如果是快照版本,那么在mvn deploy时会自动发布到私服的快照版本库中;如果是正式发布版本,那么在mvn deploy时会自动发布到正式版本库中。

  如果在一个项目中,我们依赖了模块A的快照版,还依赖了模块B的正式版本,那么在不更改依赖模块版本号的情况下,我们在进行直接编译打包该项目时:即使本地仓库中已经存在对应版本的依赖模块A,maven还是会自动从镜像服务器上下载最新的依赖模块A的快照版本。而依赖正式版本的模块B,如果本地仓库已经存在该版本的模块B, maven则不会主动去镜像服务器上下载。这也是为什么我们会在本地仓库中快照版本的依赖的目录下会看到带有时间戳的jar包,比如下面:

我们知道了这些以后,该怎么解决这个问题呢?

1.暴利解决(不优雅,所以不推荐)

  直接在本地maven的配置文件中的私服配置添加如下红框内的配置

<profile>
<id>nexus</id>
<repositories>
<repository>
<id>nexus</id>
<name>Nexus</name>
<url>http://localhost:8087/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>nexus</id>
<name>Nexus</name>
<url>http://localhost:8087/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>

2.在打包的时候加上“-U”参数,强制拉取所有依赖的最新代码

  mvn clean install -U

3.语义化版本

  首先,我们在团队协作时,要定义好开发中的依赖一定不要忘记升级版本号,然后开发的过程中还要保持版本号以“-SNAPSHOT”结尾。来把该依赖作为快照版本进行开发,这样每次别人更新完上传到私服以后,你本地打包时会自动拉取最新代码,从而方便我们的开发和维护。

三、总结

  通过本文,我们就明白了为什么快照版本的依赖,maven编译打包的时候无论本地是否存在,都会去私服拉取最新的,而正式版本的依赖,如果本地仓库已经存在,maven不会去私服拉取最新的原因,所以我们要基于快照版本进行开发,但是上线的时候一定记得变成正式版,否则如果本地正在进行开发另一个功能,提交到私服的代码有可能会被误上线。至此我们完美的解决了我们文章开头抛出的问题,并且不是暴利解决。我遇见问题,就喜欢打破砂锅弄到底,用最优雅的方式解决最复杂的问题。关于Maven,我想说的是:入门很简单,但精通有难度!

Maven版本号中隐藏的惊天大秘密的更多相关文章

  1. 发现SQL Server惊天大秘密!!

    原文:发现SQL Server惊天大秘密!! --set statistics xml onCREATE TABLE T_TEST(ID INT IDENTITY PRIMARY KEY,Create ...

  2. 微信号可以改了?我用 Python 发现了隐藏的 6 大秘密.

    “听说,微信可以改微信号了! ” 不知道谁扯了一嗓子,让办公室变成了欢乐的海洋 张姐流下了激动的泪水:“太好了!姐的年龄终于不用暴露在微信号了!” 很多人学习python,不知道从何学起.很多人学习p ...

  3. 我告诉你一个 AtomicInteger 的惊天大秘密

    i++ 不是线程安全的操作,因为它不是一个原子性操作. 那么,如果我想要达到类似 i++ 的这种效果,我应该使用哪些集合或者说工具类呢? 在 JDK1.5 之前,为了确保在多线程下对某基本数据类型或者 ...

  4. Maven具体解释之------maven版本号管理

    本文同意转载,但请标明出处:http://blog.csdn.net/wanghantong/article/38424065, 版权全部 如今所说的maven版本号不同于SVN的版本号控制哦!!! ...

  5. [转帖]WannaCry惊天大发现!疑似朝鲜黑客组织Lazarus所为

    WannaCry惊天大发现!疑似朝鲜黑客组织Lazarus所为 Threatbook2017-05-16共588524人围观 ,发现 17 个不明物体系统安全 https://www.freebuf. ...

  6. 如何在Linux服务器中隐藏PHP版本

    通常,大多数默认设置安装的web服务器存在信息泄露,这其中之一就是PHP.PHP 是如今流行的服务端html嵌入式语言(之一?).在如今这个充满挑战的时代,有许多攻击者会尝试发现你服务端的漏洞.因此, ...

  7. [react native] react-native-tab-navigator在子Component中隐藏

    因为文档只列出了TabBarIOS, 不支持Android,所以github上找到这个组件. 先说下我的页面构造:  入口文件 —> 注册组件(包含Navigator, 跳转到欢迎页)—> ...

  8. hiho #1114 : 小Hi小Ho的惊天大作战:扫雷·一

    #1114 : 小Hi小Ho的惊天大作战:扫雷·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 故事背景:密室.监视器与充满危机的广场 “我们还是循序渐进,先来考虑这 ...

  9. 如何在maven工程中加载oracle驱动

    maven中引入oracle驱动报错Missing artifact com.oracle:ojdbc14:jar:10.2.0.4.0 时间:2015年09月22日  浏览:9361次 在maven ...

随机推荐

  1. C#获取存储过程的 Return返回值和Output输出参数值

    1.获取Return返回值  程序代码 //存储过程//Create PROCEDURE MYSQL//     @a int,//     @b int//AS//     return @a + ...

  2. VMWare安装Centos 6.9

    VMWare下Centos 6.9安装教程,记录如下 1.新建虚拟机 (1)点击文件-->新建虚拟机 (2)选择 自定义(高级)-->下一步 (3)选择Workstation 12.0-- ...

  3. Ambari概览

    文章作者:luxianghao 文章来源:http://www.cnblogs.com/luxianghao/p/7886195.html  转载请注明,谢谢合作. 免责声明:文章内容仅代表个人观点, ...

  4. DNS:域名系统

    概述: DNS的作用在于将域名转换为对应的IP地址. DNS名字空间和UNIX文件系统相似,也是树形结构.以"."结尾的域名称为FQDN(Full Qualified Domain ...

  5. SQL SERVER 2012 SEQUENCE

    一.Sequence简介 Sequence对象对于Oracle用户来说是最熟悉不过的数据库对象了, 在SQL SERVER2012终于也可以看到这个对象了.Sequence是SQL Server201 ...

  6. DES对称加密算法简析

    1 对称加密算法 在了解DES算法前,先加单介绍一下对称加密算法,因为DES属于对称加密算法的一种. 对称加密算法是应用较早的加密算法,技术成熟.在对称加密算法中,数据发信方将明文(原始数据)和加密密 ...

  7. 校门外的树-poj

    问题描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……,L,都种 ...

  8. 网络分析法(Analytic Network Process,ANP)

    什么是网络分析法 网络分析法(ANP)是美国匹兹堡大学的T.L.Saaty教授于1996年提出的一种适应非独立的递阶层次结构的决策方法,它是在层次分析法(Analytic Hierarchy Proc ...

  9. Oracle11g静默安装

    静默安装Oracle11G 前期准备 1虚拟机准备: Centos 6.5 64位 内存2G 硬盘30G Cpu 4核 Hostname silent 将安装包放到/tmp/oracle目录下 2.软 ...

  10. 学习爬虫的day03 (通过代理去爬去数据)

    代理的IP通过去网上找# -*- coding: utf-8 -*- import re import _thread from time import sleep, ctime from urlli ...