1、仓库的作用
用来存储构件,同时为多个项目提供构件。这样,不同项目需要一些相同的构件时,就不用自己一遍遍手动加到各个项目中去,这样,一方面节省了磁盘空间,一方面使构件易于管理
什么是构件呢?
在maven中任何一个依赖、插件或者项目构建的输出都可以称之为构件。
例如,依赖log4j-1.2.15.jar是一个构件,插件maven-compile-plugin-2.0.2.jar是一个构件,项目构建完成生成的xxx-1.0.0-SNAPSHOT.jar是个构件。
2、构件的存储路径
路径跟构件的坐标对应,大致为
groupId/artifactId/version/artifactId-version.packing
一个具体的例子:
log4j/log4j/1.2.15/log4j-1.2.15.jar
3、仓库的分类
总体来分的话,有
- 本地仓库
- 远程仓库(包含几种特殊的远程仓库)
当maven根据坐标寻找构件的时候,首先查找本地库,如果本地库没有,会去远程仓库查找,并下载到本地库中使用。
几种特殊的远程仓库
- 中央仓库
中央仓库是maven官方提供的远程仓库,它包含了绝大部分开源的构件, 默认配置下,如果maven从本地库中找不到,便会去中央仓库寻找。 - 私服
为了节省带宽和时间(你懂得,有防火墙,国内网络从中央仓库下载的那个速度。。),我们可以选择在局域网中架设一个私有的仓库,这个仓库由工作小组或者公司内部使用,用来代理所有外部的远程仓库,而且我们内部的项目输出的构件还可以放到私服上,供其他项目使用。 - 其他公共库
除了中央仓库和私服,还有一些其他公开的远程仓库。
4、本地仓库的设置
默认情况下,每个用户目录下,都有一个名为.m2/repository/的仓库目录,以mac为例,默认仓库路径为/Users/lige/.m2/respository/。
修改默认仓库为其他路径
如果想要更改默认仓库的路径,我们可以修改~/.m2/settings.xml(mac),settings.xml是maven的全局配置文件,默认情况下是不存在的,需要从$M2_HOME_conf/settings.xml拷贝过来,然后修改:
<settings>
<localRepository>/Users/lige/maven/repo(自己希望的路径)</localRepository>
</settings/>
将项目输出的构件安装到本地仓库
本地仓库可以从远程仓库下载构件,也可以将项目输出的构件放入本地仓库。
我们在maven项目的根目录下,执行mvn clean install命令可以将项目输出的构件放入本地仓库。
5、远程仓库
5.1、中央仓库
最原始的本地仓库是空的,而且我们没有配置过任何远程仓库,但是,我们仍然可以获取到自己想要的构件,这是为什么呢?原因就是,在maven安装文件中,自带了maven维护的一个远程仓库,也就是中央仓库。打开$M2_HOME/bin/maven-model-builder-3.5.4.jar,打开org/apache/maven/model/pom-4.0.0.xml,可以看到配置
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
包含这段配置的文件是所有Maven项目都会继承的超级pom,所以,我们的Maven项目在没有配置过任何远程仓库的情况下,也能从中央仓库获取构件
5.2、配置其他远程仓库
<repositories>
<repository>
<id>repoId</id>
<name>RepositoryName</name>
<url>http://xxxxx</url>
<releases>
<enabled>true</enabled>
</releases>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
在repositories元素下,我们通过repositorie可以配置自己希望的远程仓库。
id:仓库的id,需要唯一,如果重复的话,后面的配置会覆盖前面的配置
name:仓库的名称
url:仓库的url,一般来说,该地址都基于Http协议
release:配置Maven对于发布版本构件的支持(通过enabled子元素)
snapshots:配置Maven对于快照版本构件的支持(通过enabled子元素)
layout:值为default表示仓库的布局(构件的路径)是Maven2、Maven3的默认布局,而不是Maven1的布局。
远程仓库的认证
一般的远程仓库,向中央仓库或者其他一些对广大开发者开放的远程仓库是不需要认证的,但是一些私服为了保证安全,防止非法的仓库访问,需要配置用户名和密码认证后,才能访问该私服。
认证信息需要配置在setting.xml,即maven的配置文件中,这时因为POM往往提交到代码仓库,供所有成员访问,而setting.xml只放在本机,因此配置在setting.xml更为安全。
下面是一份认证配置的例子:
<settings>
<servers>
<server>
<id>my-proj</id>
<username>admin</username>
<password>pwd</password>
</server>
</servers>
</settings>
认证需要配置server元素,其中id是仓库id(需要与pom中的id保持一致),username用户名,password密码,这样,如果仓库需要认证的话,maven根据pom中的仓库id来settings.xml中获取认证信息~~~
5.3、将项目输出的构件部署至远程仓库
5.3.1 pom.xml配置需要部署的仓库信息
<project>
<distributionManagement>
<repository><!--配置需要部署发布版本的仓库-->
<id>releases</id> <!--仓库id-->
<name>public</name><!--仓库name-->
<url>http://59.50.95.66:8081/nexus/content/repositories/releases</url><!--仓库地址-->
</repository>
<snapshotRepository><!--配置需要部署快照版本的仓库-->
<id>snapshots</id>
<name>Snapshots</name>
<url>http://59.50.95.66:8081/nexus/content/repositories/snapshots</url>
</snapshotRepository>
</distributionManagement>
</project>
5.3.2 配置仓库的认证(不赘述)
5.3.3 使用命令部署构建
使用
mvn clean deploy
将构建部署到远程仓库
6、仓库构件的版本
、快照版本和发布版本
快照版本和正式版本的区别:
本地获取这些依赖的机制不同。
如果你依赖一个库的正式版本,构建的时候,先在本地仓库中查找是否已经有了这个依赖库,如果没有的话才会去远程仓库去拉取。如果发布一个xxx-1.1.jar到远程仓库,有一个项目依赖这个库,第一次构建会把这个jar拿到本地仓库中,以后再构建就不会去访问远程仓库了。你修改了代码发布上去,也不会再拉,本地这个库不能得到更新。除非升级这个版本 xxx-1.2.jar,然后通知项目,修改依赖为这个版本。(也可以清理本地仓库,这样的话也会从远程仓库再拉一次)
那么使用-SNAPSHOT,每天构建时构建快照版本,xxx-1.1-SNAPSHOT,如果有则下载来使用。即使本地仓库已经有,也会去访问远程仓库,看是否是最新的。
7、镜像仓库
如果X仓库可以提供Y仓库提供的所有内容,那么就可以认为X是Y的一个镜像。
配置镜像仓库(以阿里镜像为例):
<mirror>
<id>nexus-aliyun</id>
<name>nexus-aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
<mirrorOf>central</mirrorOf><!--central代表是中央仓库的镜像-->
</mirror>
如果需要配置认证,可以根据id在maven的配置文件中配置认证信息即可。
mirrorOf支持*、repo1,repo2等配置方式。