1.什么是仓库
在Maven任何一个依赖、插件或者项目构建的输出,都可以成为构件。Maven统一存储所有Maven项目共享构件的这个统一位置就是仓库。
2.仓库的布局
任何一个构件都有其唯一的坐标,根据这个坐标可以定义其在仓库中的唯一存储路径。这便是Maven仓库布局方式。
例如:log4j:log4j:1.2.17这一依赖对应路径为\repository\log4j\log4j\1.2.17
其路径与坐标的大致对应关系为groupId/artifactId/version/artifactId-version.packaging
3.仓库的分类
仓库分为两类:本地仓库和远程仓库。
当Maven根据坐标寻找构件的时候,首先查看本地仓库,如果存在,直接使用;如果本地仓库不存在此构件,Maven就会去远程仓库查找,发现需要的构件之后,下载到本地仓库在使用。如果本地仓库和远程仓库都没有需要的构件,Maven就会报错。
特殊的远程仓库:
•中央仓库:是Maven核心自带的远程仓库,包含了绝大部分开源的构件。
•私服:是在局域网内架设的一个私有的仓库服务器,用其代理所有的外部的远程仓库,内部的项目还能部署到私服上供其他项目使用。
•其他公开的远程仓库:常见的有Java.net Maven库(http://download.java.net/maven/2/)和JBoss Maven库(http://repository.jboss.org/maven2/)
(1)本地仓库
在~/.m2/settings.xml中指明了本地仓库
Default: ~/.m2/repository
可通过localRepository配置,例如
<settings> <localRepository>D:\repository</localRepository> </settings
注意:~/.m2/settings.xml文件是不存在的,需要从Maven安装目录 复制$M2_HOME/conf/setting.xml一份后,在进行编辑。不推荐直接修改全局setting.xml文件
构件进入仓库的方式:
•从远程仓库下载
•mvn clean install
(2)远程仓库
安装好Maven后,如果不执行任何Maven命令,本地仓库目录是不存在的。当用户输入第一条Maven命令后,Maven才会创建本地仓库。
(3)中央仓库
由于最原始的的本地仓库是空的,Maven必须知道至少一个可用的远程仓库,才能执行Maven命令的时候下载到的构件。
$M2_HOME/lib/maven-model-builder-3.0.4.jar,然后访问maven-model-builder-3.0.4.jar\org\apache\maven\model\pom-4.0.0.xml,可以看到如下信息:
<repositories> <repository> <id>central</id> <name>Central Repository</name> <url>http://repo.maven.apache.org/maven2</url> <layout>default</layout> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories>
包含这段配置的文件是所有Maven项目都会继承的超级POM
id:central 对中央仓库进行唯一标识;名称name:Central Repository;布局layout:default;snapshots-enabled-false表示不从该中央仓库下载快照版本的构件。
(4)私服
私服是一种架设在局域网内的特殊的远程仓库,私服代理广域网上的远程仓库,供局域网内的Maven用户使用。
当Maven需要下载构件的时候,它从私服请求,如果不存在,则从外部的远程仓库下载,缓存在私服上之后,再为Maven的下载请求提供服务。此外,一些无法从外部仓库下载到的构件也能从本地上传到私服上。
私服的作用:
•节省自己的外网带宽;
•加速Maven构建
•部署第三方构件,当某个构件无法从任何一个外部远程仓库获得,比如组织内部私有构件、Oracle的JDBC驱动。建立私服后,可以将这些构件部署到这个内部仓库中,供内部的Maven项目使用;
•提高稳定性,增强控制
•降低中央仓库的负荷
4.远程仓库的配置
可以在POM中或setting.xml中配置该仓库内容如下:
<project> <repositories> <repository> <id>jboss</id> <name>JBoss Repository</name> <url>http://repository.jboss.com/maven2/</url> <layout>default</layout> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> </project>
id:唯一标识,注意中央仓库ID为central,如果其它的仓库声明用使用该ID,就会覆盖中央仓库的配置。
layout:表示仓库的布局是Maven2及Maven3的默认布局。
releases:子元素enabled的值为true,表示开启JBoss仓库的发布版本下载支持。
snapshots:子元素enabled的值为false,关闭JBoss仓库的快照版本下载支持。
releases和snapshots:
updatePolicy子元素配置更新频率,默认值是daily,表示Maven每天检查一次。其他值never-从不检测更新;always-每次构建都检查更新;interval:X - 每隔X分钟检查一次更新;
checksumPolicy子元素用来配置Maven检查检验和文件的策略。当构件部署到Maven仓库中时,会验证校验和文件,如果校验和验证失败,默认为warn,输出警告信息;fail,构件失败;ignore,忽略
(1)远程仓库的认证
认证信息必须配置在setting.xml中
<settings> ... <servers> <server> <id>deploymentRepo</id> <username>repouser</username> <password>repopwd</password> </server> <server> <id>siteServer</id> <privateKey>/path/to/private/key</privateKey> <passphrase>optional; leave empty if not used.</passphrase> </server> </servers> ... </settings>
(2)部署至远程仓库
需要编辑pom.xml文件
<project> <distributionManagement> <repository> <id>proj-release</id> <name>Proj Release Repository</name> <url>http://192.168.1.100/content/repository/proj-releases</url> </repository> <snapshotRepository> <id>proj-snapshot</id> <name>Proj Snapshot Repository</name> <url>http://192.168.1.100/content/repository/proj-snapshot</url> </snapshotRepository> </distributionManagement> </project>
distributionManagement包含repository和snapshotRepository子元素,前者表示发布版本构件仓库,后者表示快照版本构件仓库。两个子元素下都需要配置id、name、url。
往远程仓库部署的时候,需要认证,配置方式就是在setting.xml中创建一个server元素,其id与仓库的id匹配,并配置正确的认证信息,下载构件和部署构件认证配置方式是一样的。
部署命令:
mvn clean deploy
5.快照版本
快照主要用于组织内部协同开发时使用,如果是SNAPSHOT版本,在发布到私服的过程中会为构件打上时间戳,例如:2.1-20091214.221414-13,其他对该构件有依赖的项目的项目可以在构件时进行检查。默认情况下每天检查一次(updatePolicy进行控制),也可以使用命令行-U参数强制让Maven检查更新
mvn clean install -U
6.从仓库解析依赖的机制
Maven从仓库解析并使用依赖构件的规则如下:
(1)当依赖范围是system的时候,Maven直接从本地系统解析构件;
(2)根据依赖坐标计算仓库路径后,尝试直接从本地仓库寻找构件,如果发现相应构件,则解析成功;
(3)在本地仓库不存在相应构件的情况下,如果依赖的版本是显示的发布版本构件,如1.2、2.1-beta-1等,则遍历所有的远程仓库,发现后,下载并解析使用;
(4)如果依赖的版本是RELEASE或者LATEST,则基于更新策略读取所有远程仓库的元数据groupId/artifactId/maven-metadata.xml,将其与本地仓库的对应元数据合并后,计算出RELEASE或LATEST真实的值,然后基于这个真实的值检查本地或远程仓库,如步骤(2)和(3);
(5)如果依赖的版本是SNAPSHOT,则基于更新策略读取所有远程仓库的元数据groupId/artifactId/version/maven-metadata.xml,将其与本地仓库的对应元数据合并后,得到最新快照版本的值,然后检查本地或远程仓库进行下载;
(6)如果解析得到的构件版本是时间戳格式的快照,如1.41-20091104.121451-121,则复制其时间戳格式的文件至非时间戳格式,如SNAPSHOT,并使用该非时间戳格式的构件。
7.镜像
settings.xml中配置如下:
<settings> </mirrors> <mirror> <id>maven.net.cn</id> <name>one of the central mirrors in China</name> <url>http://maven.net.cn/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror> </mirrors> </settings>mirrorOf:指向被镜像仓库的ID;另外三个元素id、name、url与一般仓库无异。
更常见的用法是结合私服
<settings> </mirrors> <mirror> <id>internal-repository</id> <name>Internal Repository Manager</name> <url>http://192.168.1.100/maven2/</url> <mirrorOf>*</mirrorOf> </mirror> </mirrors> </settings>