maven中的snapshot来源与注意事项

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 镜像使用的更多相关文章

  1. 国内maven镜像,快的飞起

    在oschina关来关去的烦恼下,终于受不了去寻找其他公共库了. 阿里云maven镜像 <mirrors> <mirror> <id>alimaven</id ...

  2. 使用国内 maven 镜像 代替国外 mirror

    使用maven的都知道国外的maven下载一个是比较慢,一个是因为被墙,一些jar包无法下载,非常老火. 比如出现类似下面的错误: Unknown host repo.maven.apache.org ...

  3. 使用maven镜像

    maven 的安装目录下的 conf 文件夹下有个 settings.xml 文件,编辑该文件 在<mirrors>中插入: <mirror> <id>repo2& ...

  4. [转]使用maven镜像

    综述 用maven做项目,最郁闷的莫过于某些依赖库下载不了.被墙了,你懂的.使用maven镜像仓库及其重要,特别是国内的镜像,可以有效缓解被墙疼痛. 常用的镜像 国外镜像 ibiblio.org &l ...

  5. (转)maven镜像路径配置

    很多maven包无法自动下载怎么办?设置maven镜像setting.xml <mirror> <id>repo2</id> <mirrorOf>cen ...

  6. 阿里云Maven配置,Maven仓库配置,Maven镜像配置

    阿里云Maven配置,Maven仓库配置,Maven镜像配置 ======================== 蕃薯耀 2018年1月29日 http://www.cnblogs.com/fanshu ...

  7. Maven镜像更换为阿里云中央仓库

    前言 maven仓库默认在国外,使用难免很慢,尤其是下载依赖的时候,换为国内镜像,让你感受飞一般的感觉.国内支持maven镜像的有阿里云,开源中国等,这里换为阿里云的. 更换 修改maven配置文件s ...

  8. Maven镜像收集

    本贴主要收集国内国外速度比较快的maven镜像,OSC的MAVEN已经关闭了 0.阿里Maven镜像 setting.xml https://github.com/ae6623/Zebra/blob/ ...

  9. (转)maven镜像详解

    背景:一直以来,对maven镜像不是特别的了解,这里通过对网上资料的收集,做个详细的记录. 镜像介绍 如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像.换句话说,任何一个可以从仓 ...

  10. Maven镜像更换为阿里云中央仓库(精)

    前言 maven仓库默认在国外,使用难免很慢,尤其是下载依赖的时候,换为国内镜像,让你感受飞一般的感觉.国内支持maven镜像的有阿里云,开源中国等,这里换为阿里云的. 更换 修改maven配置文件s ...

随机推荐

  1. 进击的Python【第二十二章】

    day22 知识点概要 - Session - CSRF - Model操作 - Form验证(ModelForm) - 中间件 - 缓存 - 信号 内容详细: 1. Session 基于Cookie ...

  2. C# 对象克隆,DataTable转LIST

    public class ConvertHelper<T> where T : new() { private static string module = "ConvertHe ...

  3. NPOI导出Excel自动计算公式问题

    以前用过sheet.ForceFormulaRecalculation = true;当时能够自动计算出来. 今天把模板改了一下(没动公式,但是模板是老板改的,我也不知道他操作了什么),结果就不能自动 ...

  4. 反射找Controller中的方法

    /// <summary> /// 根据接口编码APICode,调用相应的webapi方法,注意返回值是json字符串 /// </summary> /// <param ...

  5. elasticsearch5.3.0 bulk index 性能调优实践

    elasticsearch5.3.0 bulk index 性能调优实践 通俗易懂

  6. 【java基础】(1)Java的权限修饰符(public,protected,default,private)

    访问权限修饰符权限从高到低排列是public  ,protected  ,default, private. 一.根据“是否是同包”.“是否是子类”分为4中情况+本类 5种情况 二.把 同包中的子类 ...

  7. Java基础13一异常

    1.异常概念 异常是程序在运行期发生的不正常的事件,它会打断指令的正常执行流程. 设计良好的程序应该在异常发生时提供处理这些不正常事件的方法,使程序不会因为异常的发生而阻断或产生不可预见的结果. Ja ...

  8. span标签对于margin-top,margin-bottom无效,但是margin-left,margin-right却是有效的。

    首先,span是行内元素,是没有宽高的. 我们来做个简单的布局 <div> <span>内容内容内容内容内容内容内容内容</span> </div> 页 ...

  9. window 8 电脑操作服务集合(网址)

    如何开启Win8远程桌面 http://jingyan.baidu.com/album/48206aeae06627216ad6b3bf.html?picindex=2 Win8.1用户账户的配置管理 ...

  10. Mac下php连接mysql数据库失败解决办法

    通过phpmyadmin连接mysql成功,但是通过php连接数据库失败,执行如下php语句 ? 1 @mysql_connect("localhost","root&q ...