小明:“新需求开发完了,马上要上线,先在j-one中打个包测试一下吧~!“
编译完成后,部署测试环境,“纳尼!测试环境起不来了,我开发环境正常啊!什么情况!!!”
于是小明开始查找问题:
回查代码,没问题;
tomcat、jdk等环境配置,没问题;
找到了, “XXXX-1.0-SNAPSHOT.jar”包怎么变大了???
为什么包会变大呢?原来是snapshot包的特征:允许随时同版本更新jar!!!私服中jar包提供方更新了jar,小明重新引用后,可能因为代码内容变化引起的问题。这种情况轻则编译通不过,测试环境启动有问题,重则引起线上事故!正式发布上线的代码要依赖release版本包保证稳定!
所以私服release库和snapshot库的正确使用方式是什么,下面将详细给大家介绍:
1. release库(发布库)使用规则及场景:
release库是存放稳定版本包的仓库,线上发布的程序都应从release库中引用正确版本进行使用
release库仓库名中带有“releases”标识,包括libs-releases-local,plugins-releases-local两个仓库。私服中release库使用规则如下:
a) release库不允许删除jar;
b) release库不允许同版本更新jar包(即同一个版本jar包只存在一个);
c) release库上传的jar包版本号(version)不能以“-SNAPSHOT”结束(版本号中的SNAPSHOT是release版和snapshot版区别的唯一标识);
d) 第三方包(非公司内部开发)仅可引用release版
e) 如可能,请提供接口对应源码,方便引用方使用。
release库使用场景:
根据上述release库的使用规则可知,若在开发过程中引用的不是release版的库,很有可能因为jar包更新后引用方不知道而引起代码错误,所以在如下场景场景中,请使用release仓库:
上传/发布:①当代码构建出的jar需要给其他程序提供服务时;当第三方提供的jar包或其他类型的依赖包不在远程中央仓库中时;请将正式发布版的jar用命令deploy或者在web端手动上传至私服对应的release仓库。
②如果是jar包提供方,请在代码变动时及时更新私服中对应的jar包版本,并联系管理员将淘汰jar包下线,以免引起引用事故;并及时更新发布包releasenotes(推荐在CF中维护),使引用方及时获取版本更新信息。
下载/依赖:①当代码需要使用第三方包时,除非对方代码仍在开发过程中,否则请选择三方包的正式release(发布)版本。
②如提供方是公司内部其他系统,并且该系统未提供release版本包,请主动要求该系统负责人提供release版本包,以保证开发代码版本稳定,并且关注该包的版本升级情况。
2. snapshot库(快照库)使用使用规则及场景:
snapshot库是存放中间版本包的仓库,代表该库中jar包的程序处于不稳定状态。当代码在开发过程中有其他程序需要引用时,可以提供snapshot版jar包用于调试和测试。由于snapshot库的包依然处于测试状态,所以随时可以上传同版本最新包来替换旧包,基于这种不稳定状态,maven允许snapshot库中的包被编译时随时更新最新版,这就可能会导致每次打包编译时同一个版本jar会包含不同的内容,所以snapshot库中的包是不能用来发布的;
snapshot库仓库名中带有“snapshots”标识,包括libs-snapshots-local,plugins- snapshots-local两个仓库。私服中snapshot库使用规则如下:
a) 快照库可以删除jar;
b) 快照库可以同版本更新jar包;
c) 第三方包(非公司内部开发)不允许引用快照版
d) 快照库仅可用来联调测试环节使用,不建议用于线上的稳定发布版本
e) 快照库上传的jar包版本号(version)必须以“-SNAPSHOT”结束,并上传至私服后系统将自动将“-SNAPSHOT”替换为时间戳串(本地代码引用时依然用“-SNAPSHOT”结束的版本号,无需替换时间戳),一个快照包线上将存在至少两个版本。
snapshot库使用场景:
根据上述snapshot库的使用规则可知,snapshot版的包仅供中间过程以供临时引用,若在最终发布过程中引用,很有可能因为jar包被更新或者未更新而引用方不知道而引起代码错误,所以请仅在如下场景场景中使用snapshot仓库:
上传/发布:当开发中的代码构建出的jar需要给其他程序提供服务时,请将snapshot版的jar用命令deploy或者在web端手动上传至私服对应的snapshot仓库。
下载/依赖:当代码需要使用其他开发过程中代码的jar包时,请依赖该包的snapshot(快照)版本。maven类型工程使用过程中请使用“-U”强制更新命令,来获取最新版本包。
3. 常见问题
① 上传jar包后,编译时发现代码找parent包,但是私服找不到jar,而且代码中也不需要这个parent
原因:问题多发于web端上传jar包时,自动生成pom.xml 文件中自带<parent/>节点
解决:使用web端上传时,请注意自行删除节点配置。
② 下载不了最新snapshot版本的jar包
原因:发布snapshot版本未连同对应的pom一起发布,只有jar包,没有pom,在maven编译时候会直接报错pom找不到,或者因jar包未更新编译报错。
解决:重新连同jar包一起发布即可解决。
③ 译后jar包变多或变少
原因:编译环境中传递依赖引用的快照包版本低,引用了错误版本的包进入代码。
解决:1.使用如下命令,检查依赖树,确定是哪个包引用到错的版本:mvn dependency:tree;2.清除编译环境未更新的错误包,重新编译。