当我们执行 Maven 构建命令时,Maven 开始按照以下顺序查找依赖的库:
Maven版本:
- version(SNAPSHOT):快照版本。随时更新不稳定的,每个版本都只是特定时间点的快照。同时,SNAPSHOT的不稳定性会带来风险 ,本地仓库中快照版本的依赖的目录下会看到带有时间戳的jar包。
例如:A–>B-1.3.8-SNAPSHOT(理解为A依赖了B的1.3.8-SNAPSHOT版本),那么B-1.3.8-SNAPSHOT更新且重新deploy到仓库之后,A只 需要重新构建就可以拿到最新的代码,不用修改依赖B的版本。这样达到了变更传达的透明性。- version(RELEASE):发布(正式)版本,是稳定的版本号,应该一旦发布永远不变。
- version(LATEST):不稳定版本,不管是快照还是发布版,就是去拉最新的。
注意,不推荐直接使用<version>RELEASE<version>和<version>LATEST<version>,因为它们都会在打包时去远程仓库拉取最新的,从而可能导致同一项目在打包时依赖不同的jar包。
依赖是具体的发布版本(xxx.RELEASE):
- 在本地仓库中搜索,找到则成功。
- 在远程仓库中搜索,找到则下载。
- 如果没有设置远程仓库,Maven 默认去中央仓库搜索,找到则下载。
- 在一个或多个远程仓库中搜索依赖的文件,如果找到则下载到本地仓库以备将来引用,否则 Maven 将停止处理并抛出错误(无法找到依赖的文件)。
依赖是快照版本(xxx.SNAPSHOT、RELEASE、LATEST):
- 基于更新策略更新(updatePolicy= always),则总是尝试去远程仓库拉取最新版本
- 强制快照更新------mvn clean install-U
下面再说一下maven的三种仓库:
1.本地仓库
本地环境安装maven后,会生成一个本地仓库位置(.m2/respository/ ),可在maven的配置文件中更改此位置(建议更改)
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository>D:/mvn</localRepository>
</settings>
2.远程仓库
当maven要查找构件时,发现本地仓库中没有,则需要从远程仓库下载构件到本地仓库,供项目使用。
如下面,就使用阿里云仓库
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
3.中央仓库
当我们不配置远程仓库时,maven会默认一个仓库,即maven官方的仓库,称之中央仓库。URL:http://search.maven.org/#browse
问题:maven的三种仓库已经简单说完了,那图上的maven私服是干什么的?和上面三种仓库什么关系?
maven私服
公司内部所有开发人员直接连接私服,而不是连接远程仓库。所有需要的jar包都是通过私服去远程仓库下载。和本地仓库、远程仓库的关系如下图:
如果没有私服,我们所需的所有构件都需要通过maven的中央仓库和第三方的Maven仓库下载到本地,而一个团队中的所有人都重复的从maven仓库下载构件无疑加大了仓库的负载和浪费了外网带宽,如果网速慢的话,还会影响项目的进程。很多情况下项目的开发都是在内网进行的,连接不到maven仓库怎么办呢?开发的公共构件怎么让其它项目使用?这个时候我们不得不为自己的团队搭建属于自己的maven私服,这样既节省了网络带宽也会加速项目搭建的进程,当然前提条件就是你的私服中拥有项目所需的所有构件。
总结一下,maven私服的优点:
- 节省带宽,只有私服去连接远程仓库,不用所有服务都去远程仓库下载
- 便于依赖管理,所有服务都用的同一套依赖
所以,下面我们就来看看如何搭建maven私服并且使用它。
1.nexus搭建
Nexus是maven私服的一种,搭建nexus主要有以下两种方式:
1.1 源码安装方式搭建
因nexus比较消耗资源,linux环境需要提供至少2G以上内存
1.下载源码包:https://help.sonatype.com/repomanager3/download/download-archives---repository-manager-3 选择unix版本;
2.上传到服务器解压:上传可以通过xftp等现成的工具,然后用命令tar -zxvf nexus-3.15.2-01-unix.tar.gz -C nexus进行解压。
3.设置用户并启动:
1.2 docker方式安装
1.创建一个持久目录,存放nexus数据
mkdir /nexus-data
chown 200 /nexus-data ##此处200对应容器内nexus用户的id
2.docker命令直接启动(网速慢的建议先docker pull sonatype/nexus3)
docker run -d--name nexus --privileged=true -p8081:8081 -v /nexus-data:/nexus-data sonatype/nexus3
2.nexus使用
2.1 登陆
打开nexus地址如:http://192.168.244.6:8081/ ,然后使用admin/admin123登陆。
2.2 搜索
2.3 查看仓库

- group(仓库组类型–门面):组合自己的多个库,成为一个路径对外提供服务;
- hosted(宿主类型):内部项目的发布仓库,内部jar存在在这;
- proxy(代理类型):代理一个远程仓库url,缓存一份打此经过的jar
- nuget库是 NET库
2.4 添加国内加速仓库(aliyun)
因maven中央仓库速度慢,我们一般优先使用国内远程仓库,这里配一个aliyun代理。点击 create repository 按钮,填写 name 与 remote storage 值

2.5 配置仓库查找顺序
当外部请求nexus下载jar时,nexus统一对外部提供一个服务窗口。我们配置它对远程仓库的代理顺序。编辑maven-public库,加入aliyum远程仓库:
当查询构件时,会依次查releases/napshots/aliyun/central这四个库。优先级:本地最优先,aliyun 次之,central 最末(因其速度最慢)。
2.6 通过nexus拉取jar包
我们的nexus对外服务地址url,如下图
在maven的setting文件里,通过mirror指定私服地址,此方式对全局生效

局部配置方式
在本项目的pom里,指定repository配置,此方式只对本项目生效
### 2.7 上传jar包到nexus 1.手动上传
直接在nexus的界面上,使用upload上传


在browse界面里,可查到上传的jar

2.命令上传(推荐)
1.命令方式上传,需要权限认证,在setting文件中配置
2.在项目pom中,配置上传url

3.mvn deploy命令直接上传

4.设置允许覆盖发布
3.maven自定义项目骨架
上一篇讲过通过Maven原型maven-archetype-archetype来创建自定义Archetype的方法。此插件是maven官方的项目结构,不一定符合我们的企业本义。下面,我们自已定义一种项目结构模式,并将其打成标准包,供项目组开发人员后续使用。
3.1 创建标准项目结构
我们选用一个标准的项目结构框架,结构如下
3.2 生成archetype项目
1.在选定的项目根目录下,执行命令:mvn archetype:create-from-project
2.执行完毕后,在target目录下,查看生成的archetype项目结构

3.查看此项目的pom设置

3.3 打包archetype插件并安装
此archetype项目也是一个maven工程,一样有构建/安装/发布等动作
1.进入项目根目录,执行命令:mvn clean install
2.运行完毕,查看本地仓库,已经有了此构件包

3.4 idea加载arctype,新建工程

以后建立工程时,选用此插件,即可得到与enjoy-web一样结构的项目了,如




















还没有评论,来说两句吧...