maven中的snapshot来源与注意事项
maven的依赖管理是基于版本管理的,在maven2之后,把版本管理细化snapshot 快照仓库和release发布仓库。release版本,对于发布状态的artifact(就是被依赖的jar包),如果版本号相同,即使我们内部的镜像服务器上的组件⽐本地新,maven也不会主动下载的。这⾥也为snapshot 的出现打下了伏笔。
快照版本,很多⼈不是特别理解为什么要有这个事物的出现,它的出现对于编程有什么帮助吗?没有snapshot出现之前,我们开发过程依赖别⼈开发某个包,通常maven会集中管理这些依赖包,它会要求别⼈打包成jar放到镜像服务器上,⾃⼰本地的l⽂件设置了依赖后,maven编译时,会⾃动从镜像服务器上下载依赖。但如果镜像服务器上有相同版本的依赖时,maven就不会下载,这是上段⽂字的⽩话版本,那么举个例⼦说明⼀下。
⽐如,你的⼯程要依赖的core版本是 1.0.0 版本,结果这个版本还正处于对⽅(叫⼩菜吧)的开发过程中,他利⽤maven命令mvn install 打包成jar,并部署到服务器上,根据pom设定的版本,你顺利下载了依赖包。但⼩菜后续开发过程,发现了⼀个致命bug,那么他再操作⼀次,那么,即使服务器的更新是你需要的,你只能⼲着急,只能跟⼩菜吼⼀声,“你的版本,⽼⼦⽆法更新依赖包,再给我发⼀个新的版本上去。”⼩菜⼀听,好吧,那我把版本升到 1.0.1 版本,你通过update dependencies 下载了这个新版本的jar包。这样的情况,会循环地出现,那么你和⼩菜有点恼⽕了,maven就是⽼⿏钻到风箱⾥,两头
受⽓,maven想能不能开发⼀个功能,使双⽅默认可以上传并打包下载到最新的开发版本,⽽不⽤修改版本号,否则开发完成之后,服务器上是⼀堆的release版本。有了这个思路,maven增加了划时代的功
能,snapshot ,这样依赖版本为 1.0.0-SNAPSHOT (注意必须为全⼤写),当服务器上有更新时,会⾃动下载到本地,省去了不少、和⼩菜的沟通时间,也减⼩了不少由于版本问题带来的编译错误。
任何东西的使⽤,需要遵循其规则,snapshot虽然好⽤,如果使⽤不当,反⽽易造成困惑问题。⾸先,开发⼀个依赖jar包时,注意snapshot版本号的不同,需要⼀个统⼀的地⽅记录各⾃的版本,在开发周期很长的情况下,版本号release的顺序并⾮按版本号顺序发布,重要的是,⼤家的开发版本号不能重复。如果你也在开发这个core.jar,你依赖于本地,⽽服务器上别⼈有也相同版本号的core.jar定期放在服务器上,这样,本地的jar经常会被来⾃服务器版本覆盖⽽导致错误。
总结⼀下,我们在开发阶段,可以将公⽤库的版本设置为快照版本,⽽被依赖组件则引⽤快照版本进⾏开发,在公⽤库的快照版本更新后,我们也不需要修改pom版本号来下载新的版本,直接mvn执⾏相关编译、打包命令即可重新下载最新的快照库了,从⽽保证了开发进度和质量。
1、mvn调试信息:
⽐如:mvn -X -e clean compile
-e:打印错误信息。
-X:代表debug模式。
2、如果在setting⾥⽤mirror的,直接报不到对应的jar错误。
原来setting配置:
<mirrors>
<mirror>
<id>Nexus</id>
<url>192.168.4.11/content/groups/public/</url>
<mirrorOf>*</mirrorOf>
</mirror>
</mirrors>
这个是有问题的,可以⽤-X -e看到如下信息:
[DEBUG] Repositories (dependencies): [Nexus (192.168.4.11/content/groups/
public/, releases)]
[DEBUG] Repositories (plugins) : [Nexus (192.168.4.11/content/groups/
maven打包本地jar包public/, releases)]
明显public只对release有效,对snapshot⽆效。解决办法只能需要定义mirrortype指定对snapshot有效。
更改为:
<mirrors>
<mirror>
<id>Nexus</id>
<url>192.168.4.11/content/groups/public/</url>
<mirrorOf>*</mirrorOf>
</mirror>
<mirror>
<id>Nexus2</id>
<url>192.168.4.11/content/groups/public/</url>
<mirrorOf>public-snapshots</mirrorOf> // 对snapshots有效
</mirror>
</mirrors>
<profiles> //定义public-snapshots profile
<profile>
<id>public-snapshots</id>
<repositories>
<repository>
<id>public-snapshots</id>
<url>public-snapshots</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>public-snapshots</id>
<url>public-snapshots</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>public-snapshots</activeProfile>
</activeProfiles> //使profile⽣效。
再看debug输出:
[DEBUG] Repositories (dependencies): [Nexus (192.168.4.11/content/groups/
public/, snapshots), central (/maven2, releases)]
[DEBUG] Repositories (plugins) : [Nexus (192.168.4.11/content/groups/
public/, snapshots), central (/maven2, releases)]
搞定!
总感觉上⾯的⽅法有点蹩脚!
sonatype的官⽅配置如下:
另外⼀种配置⽅法见:www.sonatype/books/nexus-book/reference/maven-sect-single-group.html 注意:maven会⾃动从仓库中检查模块A的快照版本的最新版本,当发现有更新时便进⾏下载。默认情况下,maven每天检查⼀3、注意:
次更新(由仓库配置的updatePolicy控制),⽤户也可以使⽤命令-U参数强制让maven检查更新,如maven clean install -U。
元素updatePlocy说明:⽤来配置maven从远程仓库检查更新的频率,默认的值为daily,表⽰每天检查⼀次。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论