01. Maven仓库分类
02. Maven依赖查询
1. 在 Maven 本地资源库搜索,如果没有找到,进入第 2 步,否则退出。
2. 在 Maven 中央存储库搜索,如果没有找到,进入第 3 步,否则退出。
3. 在 Maven 远程存储库搜索,如果没有找到,提示错误信息,否则退出。
03. 简介及配置
03-A. 本地仓库
Maven的本地资源库是Maven在本地存储构件的仓库,用于将Maven项目的依赖关系(jar)和其他文件存储在本地文件夹。
注意:maven的本地仓库,在安装maven后并不会创建,它是在第一次执行maven命令的时候才被创建。
maven本地仓库的默认位置:在用户的目录下都有一个 .m2/repository/ 的仓库目录,即 {USER_HOME}/.m2/repository/
1). 更改配置用户范围的本地仓库:修改 {USER_HOME}/.m2/settings.xml 文件,设置 localRepository 元素的值为想要的仓库地址
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
<localRepository>E:\develop\repositories\maven\repository</localRepository>
这时候,maven的本地仓库地址就变成了 E:\develop\repositories\maven\repository
2). 更改配置全局范围的本地仓库:在 {MAVEN_HOME}/conf/settings.xml 中更改配置,更改配置的方法同上
注意:此时更改后,所有的用户都会受到影响,而且如果maven进行升级,那么所有的配置都会被清除,所以要提前复制和备份 {MAVEN_HOME}/conf/settings.xml 文件
03-B. 中央仓库
Maven 中央仓库是由 Maven 社区提供的仓库,其中包含了大量常用的库。
中央仓库包含了绝大多数流行的开源Java构件,以及源码、作者信息、SCM、信息、许可证信息等。在本地仓库没有依赖的构件时,Maven将从中央仓库中下载。
i. 在安装Maven的时候,默认配置了中央仓库为 Maven中央仓库 。该配置存在于所有Maven项目都会继承的 超级pom.xml 中,具体配置如下:
<repositories>
<repository>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
</repository>
</repositories>
该配置与远程仓库的配置类似,元素的详细说明见 远程仓库-配置;超级pom的介绍详见附录;Maven中央仓库的url详见附录。
ii. 国内Maven中央仓库镜像下载有时会出现下载不流畅的情况,因此选用阿里云的Maven中央仓库镜像,配置 settings.xml 如下:
<!-- mirrors
| This is a list of mirrors to be used in downloading artifacts from remote repositories.
|
| It works like this: a POM may declare a repository to use in resolving certain artifacts.
| However, this repository may have problems with heavy traffic at times, so people have mirrored
| it to several places.
|
| That repository definition will have a unique id, so we can create a mirror reference for that
| repository, to be used as an alternate download site. The mirror site will be the preferred
| server for that repository.
|-->
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<name>nexus-aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
03-C 远程仓库
远程仓库是开发人员自己定制的仓库,包含了所需要的代码库或者其他工程中用到的 jar 文件。
如果所需的构件不存在于本地仓库和中央仓库,那么Maven的构建过程将被停止并将错误消息输出到Maven控制台。为避免这种情况,将在远程仓库中提供这些私有构件。
<project>
<repositories>
<repository>
<id>jboss</id>
<name>JBoss Repository</name>
<url>http://repository.jboss.org/nexus/content/groups/public/</url>
<releases>
<updatePolicy>daily</updatePolicy><!-- never,always,interval n,daily -->
<enabled>true</enabled>
<checksumPolicy>warn</checksumPolicy><!-- fail,ignore,warn -->
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
<layout>default</layout>
</repository>
</repositories>
</project>
出于安全方面的考虑,有时我们要对远程仓库的访问进行认证,一般将认证信息配置在settings.xml中:
<settings>
<servers>
<server>
<!-- 这是server的id(注意不是用户登陆的id),该id与repository元素中的id相匹配 -->
<id>same with repository id in pom</id>
<username>username</username>
<password>pwd</password>
</server>
</servers>
</settings>
附 02. Maven依赖
a-1. 当依赖的范围是system时, Maven直接从本地仓库解析构件
b-1. 根据依赖坐标计算仓库路径后, 尝试直接从本地仓库寻找构件, 如果发现相应构件, 则解析成功; 在本地仓库不存在相应构件的情况下:
b-2. 如果依赖的构件版本是发布版本, 则遍历所有的远程仓库, 发现后下载使用
b-3. 如果依赖的构件版本是RELEASE或LATEST, 则基于更新策略读取所有远程仓库的元数据, 将其与本地仓库的对应元数据合并后,
计算出RELEASE或者LATEST的真实值, 然后基于这个真实值检查本地仓库
b-4. 如果依赖的构件版本是SNAPSHOT, 则基于更新策略读取所有远程仓库的元数据, 将其与本地仓库的对应元数据合并后,
得到最新快照版本的值, 然后基于该值检查本地仓库或从远程仓库下载
b-5. 如果依赖的构件版本是时间戳格式的快照, 则复制其时间戳格式的文件 至 非时间戳格式, 并使用该非时间戳格式的构件
注: 一定要记得<release><enabled> & <snapshot><enabled>, 对于快照也是一样. 在POM的依赖声明的时候不推荐使用LATEST & RELEASE,
在Maven3中也不再支持在插件配置中使用LATEST & RELEASE, 如果不设置插件版本, 那么最终版本和release一样, maven只会解析最新的发布版本构建。
附 03-B. 中央仓库
A. Maven的中央资源库:Maven center repository
http://repo1.maven.org/maven2/
http://repo2.maven.org/maven2/
https://repo.maven.apache.org/maven2
B. Maven中央储存库:maven center repository search
Maven中央储存库的目录浏览功能现已不能使用,不过其提供了搜索功能。
所有的maven项目都会继承超级pom,包含继承默认值。它可以帮助开发人员指定最低配置的详细信息写在 pom.xml 中, 但是配置可以很容易被覆盖。
一个简单的方法来看看超级POM的默认配置,通过运行下面的命令:mvn help:effective-pom 。已经创建了一个 超级pom.xml 在D:\develop\maven\spurpom\ 文件夹中。
D:\develop\maven\spurpom> mvn help:effective-pom
附 03-C. 远程仓库
<settings>
<profiles>
<profile>
<repositories>
<!-- 需要连接到目标远程仓库的信息 -->
<repository>
<!-- 远程仓库唯一标识 -->
<id>codehausSnapshots</id>
<!-- 远程仓库名称 -->
<name>Codehaus Snapshots</name>
<!-- 如何处理远程仓库里发布版本的下载 -->
<releases>
<!-- true或者false表示:该仓库是否开启下载某种构件的发布版(快照版) -->
<enabled>false</enabled>
<!-- 更新发生的频率(Maven会比较本地POM和远程POM的时间戳), 选项如下:-->
<!-- always(一直), daily(每日,默认), interval:X(这里X是以分钟为单位的时间间隔), never(从不) -->
<updatePolicy>always</updatePolicy>
<!-- 当Maven验证构件校验文件失败时该怎么做: -->
<!-- ignore(忽略), fail(失败), warn(警告,默认) -->
<checksumPolicy>warn</checksumPolicy>
</releases>
<!-- 如何处理远程仓库里快照版本的下载. 有了 releases 和 snapshots 这两组配置, POM就可以在每个单独的仓库中, 为每种类型的构件采取不同的策略。-->
<!-- 例如, 可能有人会决定只为开发目的开启对快照版本下载的支持. 参见repositories/repository/releases元素 -->
<snapshots>
<enabled />
<updatePolicy />
<checksumPolicy />
</snapshots>
<!-- 远程仓库URL,按protocol://hostname/path形式 -->
<url>http://snapshots.maven.codehaus.org/maven2</url>
<!-- 用于定位和排序构件的仓库布局类型: default(默认), legacy(遗留) -->
<!-- Maven 2为其仓库提供了一个默认的布局;然而,Maven 1.x有一种不同的布局。我们可以使用该元素指定布局是default(默认)还是legacy(遗留)。 -->
<layout>default</layout>
</repository>
</repositories>
</profile>
</profiles>
</settings>