Maven 仓库分为本地仓库和远程仓库,寻找构件时,首先从本地仓库找,找不到则到远程仓库找,再找不到就报错;在远程仓库中找到了,就下载到本地仓库再使用。中央仓库是 Maven 核心自带的远程仓库,默认地址:http://repo1.maven.org/maven2。除了中央仓库,还有其它很多公共的远程仓库。私服是架设在本机或局域网中的一种特殊的远程仓库,通过私服可以方便的管理其它所有的外部远程仓库。
配置镜像仓库
maven默认使用中央仓库下载组件,速度怎么样,我想我不用多说。现在我们来配置一个国内的镜像仓库来提升下载速度。如果您想用其他的镜像仓库,可以自己网上搜索。
本地仓库
Maven 本地仓库默认地址为:${user.home}/.m2/repository。通过修改 %M2_HOME%/conf/settings.xml (或者:${user.home}/.m2/settings.xml,针对当前用户(推荐))配置文件可以更改本地仓库的位置。
<localRepository>/path/to/local/repo</localRepository>
修改路径如:D:/repo
镜像仓库
镜像仓库可以理解为仓库的副本,从仓库中可以找到的构件,从镜像仓库中也可以找到。比如针对中央仓库 http://repo1.maven.org/maven2 ,在中国有它的镜像仓库,这样我们直接访问镜像仓库,更快更稳定。修改settings.xm配置<settings>
...
<mirrors>
<!-- 配置阿里云镜像 -->
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
...
</settings>
其中,<mirrorOf> 指明了为哪个仓库配置镜像,可以使用通配符如:<mirrorOf>*</mirrorOf>,或者 <mirrorOf>repo1,repo2</mirrorOf> 等进行匹配。一旦配置了镜像,所有针对原仓库的访问将转到镜像仓库的访问,原仓库将不再能直接访问,即使镜像仓库不稳定或停用。在搭建私服的时候,我们通常为所有仓库设置镜像为私服地址,通过私服对所有仓库进行统一管理。<mirrorOf>*,!repo1</miiroOf>匹配所有远程仓库,repo1除外,使用感叹号将仓库从匹配中排除。需要注意的是,由于镜像仓库完全屏蔽了被镜像仓库,当镜像仓库不稳定或者停止服务的时候,Maven仍将无法访问被镜像仓库,因而将无法下载构件。
配置私服镜像地址
Nexus安装
1.下载Nexus,官网地址:http://www.sonatype.org/nexus/go
下载后的文件为:nexus-2.12.0-01-bundle.zip(Windows)或nexus-2.12.0-01-bundle.tar.gz(linux)
2.安装Nexus
解压nexus-2.12.0-01-bundle.zip到指定路径即可(路径上最好还是不要有中文)。包中文件夹如下图:解压后进入/nexus-2.12.0-01/bin目录,执行如下命令:为方便启动和退出Nexus,可将bin目录添加到环境变量,或者设置nexus服务为自启动服务
执行nexus start之后,可用浏览器访问:http://localhost:8081/nexus/如下图:
Nexus 的仓库分如下几类:
- hosted 宿主仓库:主要用于部署无法从公共仓库获取的构件(如 oracle 的 JDBC 驱动)以及自己或第三方的项目构件;
- 3rd party:第三方的项目构件(如 oracle 的 JDBC 驱动),不能从公共仓库下载到,就需要将其部署到自己的仓库中。
- Releases:部署我们自己的release构件
- Snapshots:部署我们自己的snapshot构件
- proxy 代理仓库:代理公共的远程仓库;
- virtual 虚拟仓库:用于适配 Maven 1;
- group 仓库组:Nexus 通过仓库组的概念统一管理多个仓库,这样我们在项目中直接请求仓库组即可请求到仓库组管理的多个仓库。
配置Maven使用Nexus
默认情况下,Maven依赖于中央仓库,这是为了能让Maven开箱即用,但仅仅这么做明显是错误的,这会造成大量的时间及带宽的浪费。既然文章的前面已经介绍了如何安装和配置Nexus,现在我们就要配置Maven来使用本地的Nexus,以节省时间和带宽资源。配置使用私服的方法有多种,下面先介绍其中一种:
我们可以将Repository配置到POM中,但一般来说这不是很好的做法,原因很简单,你需要为所有的Maven项目重复该配置。因此,这里我将Repository的配置放到$user_home/.m2/settings.xml中:
<settings>
...
<profiles>
<profile>
<id>dev-nexus-server</id>
<!-- 配置仓库 -->
<repositories>
<repository>
<id>local-nexus</id>
<url>http://127.0.0.1:8081/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<!-- 插件仓库 -->
<pluginRepositories>
<pluginRepository>
<id>nexus</id>
<url>http://127.0.0.1:8081/nexus/content/groups/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled><!-- 插件不使用快照版本 -->
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>dev-nexus-server</activeProfile>
</activeProfiles>
...
</settings>
部署构件至Nexus
Nexus提供了两种方式来部署构件,你可以从UI直接上传,也可以配置Maven部署构件。通过Nexus UI部署:如添加ojdbc.jar这样的第三方包
按下图所示进入上传页面
填写相关信息
添加到artifacts并上传
添加后即可在索引中查看了
通过Maven部署
更常见的用例是:团队在开发一个项目的各个模块,为了让自己开发的模块能够快速让其他人使用,你会想要将snapshot版本的构件部署到Maven仓库中,其他人只需要在POM添加一个对于你开发模块的依赖,就能随时拿到最新的snapshot。以下的pom.xml配置和settings.xml能让你通过Maven自动化部署构件:
pom.xml修改
<project>
...
<distributionManagement>
<!-- release版本仓库 -->
<repository>
<!-- id应该唯一 -->
<id>nexus-releases</id>
<name>Nexus Release Repository</name>
<url>http://127.0.0.1:8081/nexus/content/repositories/releases/</url>
</repository>
<!-- 快照版本仓库 -->
<snapshotRepository>
<id>nexus-snapshots</id>
<name>Nexus Snapshot Repository</name>
<url>http://127.0.0.1:8081/nexus/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>
...
</project>
settings.xml
<settings>
...
<servers>
<server>
<!-- 对应pox.xml中的定义 -->
<id>nexus-releases</id>
<!-- nexus对应的账号 -->
<username>admin</username>
<!-- nexus对应的密码 -->
<password>admin123</password>
</server>
<server>
<id>nexus-snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
</servers>
...
</settings>
这里我们配置所有的snapshot版本构件部署到Nexus的Snapshots仓库中, 所有的release构件部署到Nexus的Releases仓库中。由于部署需要登陆,因为我们在settings.xml中配置对应Repository id的用户名和密码。然后,在项目目录中执行
mvn deploy,你会看到maven将项目构件部署到Nexus中,浏览Nexus对应的仓库,就可以看到刚才部署的构件。当其他人构建其项目时,Maven就会从Nexus寻找依赖并下载。