文章目录
1.前言
本系列文章记录了 Maven 从0开始到实战的过程,Maven 系列历史文章清单:
(一)5分钟做完 Maven 的安装与配置
(二)使用 Maven 创建并运行项目、聊聊 POM 中的坐标与版本号的规则
(三)Maven仓库概念及私服安装与使用 附:Nexus安装包下载地址
(四)图解Maven3依赖的功能特性:依赖范围、依赖传递、依赖冲突
(五)Maven模块的继承与聚合 多模块项目组织构建
(六)详细聊聊 Maven 的生命周期、阶段(phase)、插件目标(goal)
其实在前面两篇文章中我们提到过了Maven仓库,包括 本地仓库的配置、镜像配置、依赖引入等,本篇主要是系统的讲述一下 Maven 仓库的概念与使用,以及如何通过 Nexus 安装私服。
2.Maven的仓库
在Maven出现之前,我们在一个项目中要使用的三方的 jar
包,需要到各类官网中下载下来,并放到项目的/lib
目录下,如果有多个项目都要使用到同一个jar
包的话,就需要每个项目都复制一份,这种方式就造成了大量的重复。
而有了 Maven 的仓库之后,仓库给各种构件提供一个存储的位置,我们知道,通过 Maven 建立的坐标体系 groupId
,artifactId
,version
可以确定保存在唯一一个构件,我们只需要在仓库中保存一份jar
包,通过在pom.xml
引入对应的坐标,就可以在项目中使用啦。
2.1.仓库类型
Maven 的仓库只有两种类型:本地仓库、远程仓库,也就是字面的含义,一个在本地硬盘中,一个在网络中。
对于 远程仓库 来说,有几种特殊的子类型,最特殊的就是 Maven 的 中央仓库,这个是 Maven 提供的官方仓库,我们可以在里面找到市面上的几乎任何一个开源构件。除了中央仓库之前,还有其他的公共仓库,例如:JBoss的仓库,阿里云、腾讯云的镜像仓库等。
另外一种就是我们接下来要讲到的私服了,私服是假设在局域网中的仓库服务,也可以看作是对公用远程仓库的代理。
他们的关系图下图所示:
2.2.仓库搜索服务
我们在开发中,想要使用到某个构件的时候,就需要去搜索这个构件对应的坐标,除了在官网、GitHub等网站搜索以外,我们还可以直接使用仓库搜索服务来搜索构件。
搜索构件的网站还是挺多的,我一般使用的是 《mvnrepository》,打开之后直接在搜索栏输入你想要找的构件的groupId
或artifactId
,例如:想找到Spring的相关Jar包,就可以输入org.springframework
3.私服Nexus
私服就像是本地仓库与中央仓库的中间层,本地的开发电脑在引入某个依赖的时候,可以先从私服查找,如果私服没有找到再去公用仓库下载,同时,也允许我们将开发好的某些构件上传到私服中,供其他的开发者下载使用。
这么做带来一定的好处,例如:
- 节省带宽,增加构件的下载速度,同时也增加了仓库的稳定性。
在同一个局域网中,只要有一个开发者引入了某个构件,触发了私服从公用仓库中下载构件后,私服就会将这构件缓存到私服所在的服务器中。此时,再有其他的开发者要使用这个构件,就能够直接从局域网下载了,局域网相对于公网,更快更稳定。 - 可以上传公共仓库中没有的构件,与同一局域网中的其他开发者共享。
私服的网络交互关系如下图所示:
既然私服这么好,我们就要把私服安装好,使用起来。业界使用最多的私服是Nexus,下面我们就来看一下如何对Nexus进行安装和配置。
3.1.Nexus的安装与配置
先贴两个官方的文档,能够访问的同学可以直接访问:
国内可能很难访问到官网,访问不到的同学也没关系,可以从以下位置下载安装包:
- 《CSDN下载资源》
- 《百度网盘下载》 提取码:
f0t9
网盘中包含了 windows、Unix、Mac 三种不同操作系统的安装包,可以按需下载,不同系统的安装方式都是大同小异的,本篇主要介绍的是通过 CentOS7 来进行安装。
如果不想手动下载安装包,可以考虑直接看下面的 使用Docker安装Nexus。
注:Nexus是一个Java服务,所以在安装之前,我们需要先配置好Java环境,Nexus3需要配置JDK8
,如果已经有了Java环境,可以直接开始下面的安装步骤。
3.1.1.使用安装包安装
安装方法非常简单,先进入CentOS服务器,在/usr
中创建安装目录nexus
,将tar包拷贝到这个位置解压:
tar -zxvf nexus-3.47.1-01-unix.tar.gz
解压完成之后,会生成两个文件夹,分别是:nexus-3.47.1-01
与 sonatype-work
,进入./nexus-3.47.1-01/bin
,现在就可以直接启动Nexus了
# 后台启动
./nexus start
# 停止服务
./nexus stop
# 重启服务
./nexus restart
# 查看运行状态
./nexus status
启动好后,可以通过浏览器访问,我这里的服务器内网ip是192.168.200.101
,通过 http://192.168.200.101:8081
访问,此时就安装成功了:
3.1.2.使用Docker安装
对使用Docker不感兴趣的同学可以跳过本节,直接看到下面的Nexus配置。
如果你不会使用Docker,又对Docker感兴趣的话,可以尝试花个10多分钟,看看我之前的两篇文章:《Docker基本概念与安装使用》 《Docker镜像仓库》。
首先要去Docker镜像仓库中找到Nexus的镜像:
在当前页往下翻,可以看到很多运行的指令,这里我们需要考虑的是私服中jar包的持久化问题,因为后续开发的过程中会不断的往私服发布jar包,我们需要将Docker容器中的数据目录挂在到宿主机中,以免数据丢失。
为了到达这个要求,我们需要执行如下的指令:
docker volume create --name nexus-data
# 将容器的8081端口映射到宿主机的8082端口
docker run -dp 8082:8081 --name nexus -v nexus-data:/nexus-data sonatype/nexus3
同样的ip,使用 8082 也访问成功了
3.2.Nexus配置
首先需要使用管理员账号登录,管理员密码在sonatype-work/nexus3
文件夹里面,在里面可以找到一个admin.password
的文件,打开它会得到一串uuid,这就是密码:
9d86042e-21ce-4098-9f76-4d64e27d5554
如果是docker的话,需要使用以下指令进入到容器中,然后在同样的位置找到密码。:
docker exec -it nexus bash
获取到密码之后,回到网页上,点击右上角的 sign in ,使用 admin
登录,接下来会进入一个引导流程,会做下面两个配置:
- 修改密码:这里直接改成
admin123
- 配置是否允许匿名登录:即后面使用Maven连接私服的时候是否需要使用密码
安全的配置一般都是不允许使用匿名登录的,这里我们选择Disable anonymous access
。
3.2.1.仓库配置
登录成功之后,我们需要在私服中配置国内的公用仓库作为私服下载构件的下载源,在这之前,我们先看一下默认的仓库配置。打开Server administration and configuration
进行配置,也就是标题栏上面那个齿轮,然后打开Repositores
:
打开之后可以看到一些默认的仓库,我们需要注意红框中的那4个:
Type:
proxy
:代理仓库,用来代理中央仓库或其他的远程公用仓库。hosted
:用来保存我们在局域网中发布的构件,也就是私有仓库。group
:仓库分组,里面可以配置多个仓库,并指定仓库访问的优先级。
Name:
maven-snapshots
:用于存放里程碑版本为SNAPSHOT
的构件。maven-release
:存放非SNAPSHOT
的构件。maven-central
:代理Maven中央仓库,这里会缓存从中央仓库下载的构件。maven-public
:是仓库的分组,这个仓库中配置了上面三个仓库的访问顺序。
现在,我们需要新建一个仓库代理阿里云公用仓库https://maven.aliyun.com/repository/central
,并将其放到 snapshots
与 maven-central
之间。回到仓库列表页面,点击左上角的Create repository
,然后选择`maven2(proxy)
然后打开maven_public
,将ali_repo
配置上去:
如果是正式环境使用的话,还需要对新建角色role
,并针对每一个开发者都创建一个用户user
,这里只做演示,就不配置用户了,直接使用admin。
4.私服的使用
4.1.修改Maven配置
先修改setting.xml
的两个配置,让Maven可以连接上私服:
首先是远程仓库认证,上面我们选择了Disable anonymous access
,如果是允许匿名访问的话,这里就可以不用配置。
<servers>
<server>
<id>nexus</id>
<username>admin</username>
<password>admin123</password>
</server>
</servers>
然后是镜像配置,这里的url
配置成上面所说的maven-public
地址:
<mirrors>
<mirror>
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<url>http://192.168.200.101:8081/repository/maven-public/</url>
</mirror>
</mirrors>
注意:两个配置中的id
需要保持一致
4.2.从私服中下载构件
我尝试引入一个spring-core
的jar包(一定本地仓库中没有的,不然不会触发从私服中拉取),去查看私服中是否进行了下载:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.20</version>
</dependency>
</dependencies>
上图可以看到,私服的仓库路径中已经有了spring-core包,验证成功。
4.3.推送构件到私服
接下来试试如何推送自定义构件到私服中,在之前的两篇文章中我们已经介绍了如何通过package
插件将项目打成一个可执行的包,但如果想要把这个包发布到仓库中的话,需要使用以下的两个指令。
# 发布到本地仓库
mvn clean install
# 发布到远程仓库
mvn clean deploy
# 如果需要忽略test
mvn clean deploy -Dmaven.test.skip=true
<groupId>com.ls.mavendemo</groupId>
<artifactId>hello-world-2</artifactId>
<version>1.0-SNAPSHOT</version>
通过 deploy
指令将当前的项目打包并上传到私服中,然后就报了个错:
Deployment failed: repository element was not specified in the POM inside distributionManage
ment element or in -DaltDeploymentRepository=id::layout::url parameter
这是因为我们还没有在POM中配置将构件推送到哪个仓库中,在pom.xml
中加入以下配置,需要注意id
与setting.xml
中的server
相同,以及url中的仓库地址是不是snapshots
:
<distributionManagement>
<repository>
<id>nexus</id>
<url>http://192.168.200.101:8081/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>nexus</id>
<url>http://192.168.200.101:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
再次运行deploy
之后,提示上传成功,查看一下私服的仓库:
如果是上传正式版本,我们可以修改verison
,如下:
<groupId>com.ls.mavendemo</groupId>
<artifactId>hello-world-2</artifactId>
<version>1.0.0</version>
再次deploy
之后,直接查看maven-public
库:
发现两个版本的构件都有了,后续其他的项目协作开发者就可以直接引入使用了。
4.4.打包源码
在开发协作中,有时候还需要将源码发布到私服中以便其他开发者下载,源码中包含了注释和接口说明,更有利于协作,例如:api包、封装的工具包、基础架构包等。
但是Maven的默认生命周期中没有加入打包源码的插件,所以需要我们自行引入,在plugins
标签中加入插件:
<plugin>
<!--源码插件引入-->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.0.1</version>
<!--执行计划-->
<executions>
<execution>
<!--在生命周期的哪个阶段执行-->
<phase>verify</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
Maven的生命周期和插件会在后面的文章中详细的讲述,这里只放一个使用方法。重新打包完成之后,查看Maven仓库会发现里面多了一个xxx-sources.jar
的源码包:
5.小结
本篇主要讲述了仓库的类型与使用,并讲解了如何安装和配置Nexus私服,以后可以直接在公司里面部署使用了。
使用的时候需要注意的是,本地的Maven配置文件setting.xml
以及pom.xml
中,涉及到仓库认证的部分,需要保证server
与mirror
, repository
,snapshotRepository
中的id
标签的值保持一致。
下一篇将会继续讲解Maven中依赖的相关内容,包括:依赖传递、依赖冲突、依赖调解、依赖的归类、排除依赖等内容。
希望本文对你有所帮助,如果觉得有帮助的话,可以帮忙点点赞哦!