zoukankan      html  css  js  c++  java
  • 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,表示每天检查一次。
  • 相关阅读:
    gain 基尼系数
    luogu P5826 【模板】子序列自动机 主席树 vector 二分
    牛客挑战赛39 树与异或 离线 树上莫队 树状数组 约数
    4.22 省选模拟赛 三元组 manacher 回文自动机
    4.22 省选模拟赛 最优价值 网络流 最大权闭合子图
    4.18 省选模拟赛 消息传递 树剖 倍增 线段树维护等比数列
    luogu P4008 [NOI2003]文本编辑器 splay 块状链表
    牛客挑战赛39 密码系统 后缀数组
    luogu P1526 [NOI2003]智破连环阵 搜索+最大匹配+剪枝
    luogu P4095 [HEOI2013]Eden 的新背包问题 多重背包 背包的合并
  • 原文地址:https://www.cnblogs.com/adolfmc/p/5066466.html
Copyright © 2011-2022 走看看