maven中的snapshot来源与注意事项

(2012-04-23 15:37:48)

标签:

杂谈

分类: java
maven的依赖管理是基于版本管理的,在maven2之后,把版本管理细化snapshot 快照仓库和release发布仓库。release版本,对于发布状态的artifact(就是被依赖的jar包),如果版本号相同,即使我们内部的镜像服务器上的组件比本地新,maven也不会主动下载的。这里也为snapshot 的出现打下了伏笔。

快照版本,很多人不是特别理解为什么要有这个事物的出现,它的出现对于编程有什么帮助吗?没有snapshot出现之前,我们开发过程依赖别人开发某个包,通常maven会集中管理这些依赖包,它会要求别人打包成jar放到镜像服务器上,自己本地的pom.xml文件设置了依赖后,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>http://192.168.4.11/content/groups/public/</url>
            <mirrorOf>*</mirrorOf>
        </mirror>
</mirrors>
这个是有问题的,可以用-X -e看到如下信息:
[DEBUG] Repositories (dependencies): [Nexus (http://192.168.4.11/content/groups/
public/, releases)]
[DEBUG] Repositories (plugins)     : [Nexus (http://192.168.4.11/content/groups/
public/, releases)]

明显public只对release有效,对snapshot无效。解决办法只能需要定义mirrortype指定对snapshot有效。
更改为:
<mirrors>
    <mirror>
            <id>Nexus</id>
            <url>http://192.168.4.11/content/groups/public/</url>
            <mirrorOf>*</mirrorOf>
        </mirror>
        <mirror>
            <id>Nexus2</id>
            <url>http://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>http://public-snapshots</url>
                    <releases>
                        <enabled>false</enabled>
                    </releases>
                    <snapshots>
                        <enabled>true</enabled>
                    </snapshots>
                </repository>
            </repositories>
            <pluginRepositories>
                <pluginRepository>
                    <id>public-snapshots</id>
                    <url>http://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 (http://192.168.4.11/content/groups/
public/, snapshots), central (http://repo1.maven.org/maven2, releases)]
[DEBUG] Repositories (plugins)     : [Nexus (http://192.168.4.11/content/groups/
public/, snapshots), central (http://repo1.maven.org/maven2, releases)]

搞定!
总感觉上面的方法有点蹩脚!
sonatype的官方配置如下:
另外一种配置方法见:http://www.sonatype.com/books/nexus-book/reference/maven-sect-single-group.html

3、注意:maven会自动从仓库中检查模块A的快照版本的最新版本,当发现有更新时便进行下载。默认情况下,maven每天检查一次更新(由仓库配置的updatePolicy控制),用户也可以使用命令-U参数强制让maven检查更新,如maven clean install -U。
元素updatePlocy说明:用来配置maven从远程仓库检查更新的频率,默认的值为daily,表示每天检查一次。

maven中的snapshot来源与注意事项的更多相关文章

  1. Maven中的SnapShot版本和Release版本

    # Maven中的SnapShot版本和Release版本 ## 区别 - SnapShot 快照版本- Release 发布版本 ## 重要区别 - 本地获取这些依赖的机制不同,如果是快照版本,Ma ...

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

    Maven中建立的依赖管理方式基本已成为Java语言依赖管理的事实标准,Maven的替代者Gradle也基本沿用了Maven的依赖管理机制.在Maven依赖管理中,唯一标识一个依赖项是由该依赖项的三个 ...

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

    Maven中建立的依赖管理方式基本已成为Java语言依赖管理的事实标准,Maven的替代者Gradle也基本沿用了Maven的依赖管理机制.在Maven依赖管理中,唯一标识一个依赖项是由该依赖项的三个 ...

  4. maven中运行hibernate5的一些注意事项

    问题1:Could not bind factory to JNDI hibernate.cfg.xml中<sessionFactory> 标签中的name="foo" ...

  5. maven 中snapshot版本和release版本的区别

    maven中的仓库分为两种,snapshot快照仓库和release发布仓库.snapshot快照仓库用于保存开发过程中的不稳定版本,release正式仓库则是用来保存稳定的发行版本.定义一个组件/模 ...

  6. maven中snapshot快照库和release发布库的区别和作用

    在使用maven过程中,我们在开发阶段经常性的会有很多公共库处于不稳定状态,随时需要修改并发布,可能一天就要发布一次,遇到bug时,甚至一天要发布N次.我们知道,maven的依赖管理是基于版本管理的, ...

  7. 关于maven中的快照版本(snapshot)与正式版本(release)解析。

    Maven中建立的依赖管理方式基本已成为Java语言依赖管理的事实标准,Maven的替代者Gradle也基本沿用了Maven的依赖管理机制.在Maven依赖管理中,唯一标识一个依赖项是由该依赖项的三个 ...

  8. maven中snapshot快照库和release发布库的区别和作用 (转)

    Maven介绍,包括作用.核心概念.用法.常用命令.扩展及配置 http://www.trinea.cn/android/maven/ 本文来源于铁木箱子的博客http://www.mzone.cc ...

  9. Maven不能下载SNAPSHOT包但是能下载RELEASE包的解决办法

    在使用过程中,Maven默认配置是不能下载SNAPSHOT包的,这是基于一种代码稳定性进行考量得出的结论.引入SNAPSHOT包最大的问题就是,由于SNAPSHOT允许重复上传,所以引用一个这样的包开 ...

随机推荐

  1. build-your-own-lisp

    https://www.gitbook.com/book/ksco/build-your-own-lisp/details

  2. Revit API修改保温层厚度

    start [Transaction(TransactionMode.Manual)] [Regeneration(RegenerationOption.Manual)] ;, newLayer); ...

  3. WinForm基于插件开发实现多项配置存储

    一.课程介绍和实例在线演示 明人不说暗话,跟着阿笨一起玩WinForm.本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的一部分,阿笨后续会计划将实际项目中的一些比较实用的关于C ...

  4. Java Calendar,Date,DateFormat,TimeZone,Locale等时间相关内容的认知和使用(7) TimeZone

    本章介绍TimeZone. TimeZone 简介 TimeZone 表示时区偏移量,也可以计算夏令时.在操作 Date, Calendar等表示日期/时间的对象时,经常会用到TimeZone:因为不 ...

  5. NSString 和 NSData 转换

    NSString 转换成NSData 对象 NSData* xmlData =[@"testdata" dataUsingEncoding:NSUTF8StringEncoding ...

  6. Oracle 备份、恢复单表或多表数据步骤

    Oracle 备份.恢复单表或多表数据步骤,适用于 Oracle 8.9.10.        *备份单表或多表数据: exp user/password@server file=filefullpa ...

  7. Linux学习12-CentOS设置多个tomcat开机自启动

    前言 一台服务器上有多个tomcat环境,重启服务器后,每次需要手动一个个启动服务,非常麻烦,于是可以设置tomcat开机自启动. tomcat开机自启动非常慢,可以修改jvm下配置解决tomcat开 ...

  8. JVM调优系列:(五)JVM常用调试参数和工具

    转自:http://blog.csdn.net/opensure/article/details/46715769 JVM常用调试参数: –verbose:gc在虚拟机发生内存回收时在输出设备显示信息 ...

  9. Android UI布局之LinearLayout

    LinearLayout是Android中最经常使用的布局之中的一个.它将自己包括的子元素依照一个方向进行排列.方向有两种,水平或者竖直.这个方向能够通过设置android:orientation=& ...

  10. M2Crypto安装方法以及配置LDFLAGS、CFLAGS

    python3.7+mac环境: $ brew install openssl && brew install swig $ brew --prefix openssl /usr/lo ...