Maven之——仓库(下)

Maven之——仓库(下)

1、    快照版本

Maven世界中任何项目或者构件都有自己的版本。Maven在构建时检测到构件是快照版本、并且当前构件不是最新版本的时候、就会自动更新、Maven的检测周期在前面在POM中配置仓库的时候提到过、<Repository>…<snapshot>true…、开启使用snapshot构件的时候、可以在snapshot标签内指定一个updatePolicy、默认值是daily、也就是每天检测一次更新、更详细的看上面。

从实际场景来理解快照版本的意义:假设甲乙分别开发AB两个模块、乙开发的B高度依赖与甲开发的A模块、如果没有快照版本的做法就是、甲每次更新A之后生成新的版本号上传到Maven私服仓库中、乙每次使用的时候都要向甲询问是否有最新版本、有的话就更新乙的B项目中关于A构件的依赖的版本号、以便得到最新的版本、这样不但繁琐、还有可能因为一时疏忽或者其他原因照成乙的B项目构建失败。而如果使用快照版本则可以很好解决这个问题、Maven解析快照版本的大致过程如下——当甲将项目A定义成快照版本、比如1.0-snapshot、然后上传到私服后(甲必须构件成功之后才能发布到私服仓库)、Maven检测到是快照版本、就会自动为构件打上时间戳。比如1.0-20141101.142213-1就表示2014年11月1日14点22分13秒第一次快照。有了这个时间戳、Maven就能随时找到仓库中改构件的最新版本、乙只需要在B项目的POM文件的仓库配置中指定开启使用Snapshot模式、并且指定updatePolicy就可以了、这样Maven就会根据指定个更新周期定期的检测最新版本、一旦有最新版本、就会下载。

当项目经过完善的测试需要发布的时候、就可以将快照版改为发布版了、如将1.1-Snapshot 改成1.1版本。表示该构件版本已经稳定、我们在引用外部的构件的时候最好不要使用快照版本、因为其不稳定性很可能又有了最新的版本、而最新的版本与我们的需求不相符、导致构件失败。

2、    从仓库解析依赖的机制

当本地仓库没有所需的依赖的时候、Maven会自动从远程仓库下载、当依赖版本为快照版本的时候、Maven又会自动下载最新的快照版本、Maven3不再支持在插件中配置RELEASE和LASTEST、本质原因是这种解析策略会有可能使用不稳定版本导致构件失败、具体的Maven从仓库解析依赖的规则:

1)     当依赖的范围是system的时候、Maven直接从本地文件系统解析构件。

2)     根据依赖坐标计算仓库路径后、尝试直接从本地仓库寻找构件、找到、则解析成功。

3)     在本地仓库中不存在情况下、如果依赖版本是显示发布版也就是稳定版的构件即有明确指定的版本号、如4.1,3.8等、则遍历所有远程仓库、找到后、下载并解析使用。

4)     如果历来的版本是SNAPSHOT的时候、则基于更新策略读取所有远程仓库的元数据groupId/artifactId/verion/maven-metatata.xml将其与本地仓库合并后、得到最新的快照版本、然后检测本地仓库或者从远程仓库下载。

5)     如果最后解析的是时间戳格式的快照版、则将时间戳格式是文件复制至非时间戳格式、并使用。

3、    镜像

如果仓库X可以提供仓库Y存储的所有内容、那么就可以认为X是Y的一个镜像、换句话说、任何可以从仓库Y中获得的构件、都能够从它的镜像中获取。关于镜像的配置是在settings.xml中:

    <mirrors>
        <mirror>
            <id>mirrorId</id>
            <mirrorOf>repositoryId</mirrorOf>
            <name>Human Readable Name for thisMirror.</name>
            <url>http://my.repository.com/repo/path</url>
        </mirror>
    </mirrors>

关键是mirrorOf、指定的是被代理的仓库的ip、此仓库也在前面提到过。比如我们为前面配置的jboss仓库、如6.4

    <repositories>
        <repository>
            <id>jboss-maven2-release-repository</id>
            <name>JBoss Repository</name>
            <url>http://repository.jboss.org/maven2/</url>
            <layout>default</layout>
            <!--<snapshots>-->
            <!--<enabled>false</enabled>-->
            <!--</snapshots>-->
            <snapshots>
                <enabled>true</enabled>
                <checksumPolicy>ignore</checksumPolicy>
                <updatePolicy>daily</updatePolicy>
            </snapshots>
            <releases>
                <enabled>true</enabled>
            </releases>
        </repository>
    </repositories>

配置一个代理、假如代理仓库的是我们自己搭建的私服(一般情况下我们都会使用私服代理所有外部远程仓库)URL:http://192.168.1.8/content/repositories则镜像的配置:

    <mirrors>
        …
        <mirror>
            <id>nexus</id>
            <mirrorOf> jboss-maven2-release-repository</mirrorOf>
            <name>Mirror of jboss</name>
            <url> http://repository.jboss.org/maven2/</url>
        </mirror>
        …
    </mirrors>

如果想要使用私服代理所有远程仓库、则只需将<mirrorOf> jboss-maven2-release-repository</mirrorOf>改为:<mirrorOf> *</mirrorOf>就可以了。

更高级的镜像配置:

            <mirrorOf>*</mirrorOf> : 匹配所有远程仓库
            <mirrorOf>external:*</mirrorOf>: 匹配所有不在本机的远程仓库
            <mirrorOf>repo1, repo2</mirrorOf>: 匹配仓库repo1、repo2、使用逗号分割多个远程仓库。
            <mirrorOf>*, ! repo1</mirrorOf>: 匹配所有远程仓库、repo1除外、使用!将远程仓库从匹配中排除。

4、    仓库搜索服务

使用Maven进行日常开发的时候、当知道需要使用的项目、构件的名称的时候、就可以根据名称去搜索其坐标、进而在项目中使用、下面是几个常用的提供仓库搜索服务的网址:

1)     Sonatype Nexus

地址:http://repository.sonatype.org/

2)     Central Repository

地址:http://search.maven.org/#browse

3)     MVNrepository

地址:http://mvnrepository.com/

4)     jboss-maven2-release-repository(可作为下载地址、不提供搜索功能)

地址:http://repository.jboss.org/maven2/

总结

理解Maven仓库概念、Maven仓库布局、可以通过构件的信息知道其在Maven仓库中的位置、理解Maven本地仓库、远程仓库、中央仓库的概念、知道中央仓库是在哪里指定的(%M2_HOME/lib/maven-model-builder-3.2.3.jar/org/apache/maven/model/pom.xml)。理解仓库的配置、知道如何配置远程仓库、当需要认证的时候知道如何配置认证信息。理解快照版本存在的意义、掌握从仓库解析依赖的机制(注意Maven3以后的区别、就是插件配置不再提供RELEASE和LASTEST属性)、最后是镜像的概念、掌握如何为指定仓库、或者任意仓库配置镜像。

时间: 2024-12-19 04:53:27

Maven之——仓库(下)的相关文章

maven联通网络下中央仓库不能访问的解决办法

最近刚开始学习maven工具,下载解压完毕,环境变量配置完毕,运行如下命令尝试快速构建一个maven项目: mvn archetype:generate 结果就有问题: [INFO] Scanning for projects...Downloading: http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-clean-plugin/2.4.1/maven-clean-plugin-2.4.1.pom[WARNING] Fai

推荐几个好的 Maven 常用仓库网址

注意,以下内容转载自:推荐几个好的 Maven 常用仓库网址 Maven 确确实实是个好东西,用来管理项目显得很方便,但是如果是通过 Maven 来远程下载 JAR 包的话,我宿舍的带宽是4兆的,4个人共用,有时候用 Maven 来远程下载 JAR 包会显得很慢,一般我发现下载速度不明显的时候,我就 Ctrl + C 来终止它的下载.然后改用手动来下载,因为用迅雷一类的工具来下载会快很多.我机子上 Maven 的本地仓库的很多 JAR 包我都是手动下载的.手动下载的话就会带来一个问题,就是,怎么

maven搜索仓库

——爱迪生经过1001次实验成功发明了电灯 1.maven搜索服务 国外常见maven仓库:可能打开很慢甚至无法打开,解决方案.代理.svn或国内maven搜索仓库 1.1 Sonatype Nexus http://repository.sonatype.org/ 1.2 Jarvana http://www.jarvana.com/ 1.3MVNbrowser http://www.mvnbrowser.com 1.4 MVNrepository (访问速度比上面三个快些) http://m

一步一步教你分享开源项目到 Maven 中心仓库

欢迎各位关注我的新浪微博:http://weibo.com/kifile 转载请标明出处(http://blog.csdn.net/kifile) 相信很多程序猿朋友都或多或少写过一些通用库文件,也有很多人会秉着开源的精神将代码分享到类似 Github 之类的代码托管网站去. 其实大家分享代码的时候,目的在于让更多的人使用,但是如果仅仅是放在 Github 这些工具上等人家下载使用,其实很多人是会觉得很麻烦的,那么有什么方法能够帮助我们在不下载 Github 上的源码的时候,使用这些代码吗? 回

maven本地仓库.m2文件夹路径讲解

Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑.当你使用Maven的时候,你用一个明确定义的项目对象模型来描述你的项目,然后Maven可以应用横切的逻辑,这些逻辑来自一组共享的(或者自定义的)插件. 基本的常用

Maven本地仓库配置

本地仓库是远程仓库的一个缓冲和子集,当你构建Maven项目的时候,首先会从本地仓库查找资源,如果没有,那么Maven会从远程仓库下载到你本地仓库.这样在你下次使用的时候就不需要从远程下载了.如果你所需要的jar包版本在本地仓库没有,而且也不存在于远程仓库,Maven在构建的时候会报错,这种情况可能是有些jar包的新版本没有在Maven仓库中及时更新. Maven缺省的本地仓库路径为${user.home}/.m2/repository. 可以通过修改${user.home}/.m2/settin

Maven远程仓库的各种配置

(十一)Maven远程仓库的各种配置 1.远程仓库的配置 在平时的开发中,我们往往不会使用默认的中央仓库,默认的中央仓库访问的速度比较慢,访问的人或许很多,有时候也无法满足我们项目的需求,可能项目需要的某些构件中央仓库中是没有的,而在其他远程仓库中有,如JBoss Maven仓库.这时,可以在pom.xml中配置该仓库,代码如下: 1 <!-- 配置远程仓库 --> 2 <repositories> 3 <repository> 4 <id>jboss<

maven入门(10)maven的仓库

[0]README 1)本文部分文字转自 "maven实战",旨在 review  "maven(6)仓库" 的相关知识: [1]何为 Maven仓库 1)intro to 构件:在maven中,任何一个依赖,插件或者项目构建的输出,都可以称为 构件:任何一个构件都由一组坐标唯一标识:(干货--构件的定义) 2)仓库:得益于坐标机制,任何 maven项目 使用任何一个构件的方式都是相同的.在此基础上,maven 可以在某个位置上统一存储 所有maven 项目共享的构

maven 本地仓库和远程仓库

在Maven中,任何一个依赖.插件或者项目构建的输出,都可以称之为构件. Maven在某个统一的位置存储所有项目的共享的构件,这个统一的位置,我们就称之为仓库.(仓库就是存放依赖和插件的地方) 任何的构件都有唯一的坐标,Maven根据这个坐标定义了构件在仓库中的唯一存储路径, 解读Maven在仓库中的存储路径: 1.基于groupId准备路径,将句点分隔符转成路径分隔符,就是将  "."  转换成 "/" ; example: org.testng --->o