Loading...
墨滴

楼仔

2021/07/18  阅读:60  主题:橙心

【Maven系列1】很简单的Maven仓库

介绍Maven,然后详细讲解Maven仓库相关知识。

前言

开始以为Maven需要掌握的东西很少,结果发现还是有些内容的。Maven实操的内容比较多,我就先专门通过本篇文章,对Maven进行简单介绍,然后重点讲解Maven仓库相关知识。

感觉Maven相对简单,网上相关的资料也很多,那我为啥还需要专门写这个系列呢?其实主要还是记录自己的学习轨迹,便于后续查询学习内容,仅此而已!

Maven 介绍

什么是Maven?

Maven 是一个项目管理工具,它包含了一个项目对象模型(Project Object Model),反映在配置中,就是一个 pom.xml 文件。是一组标准集合,一个项目的生命周期、一个依赖管理系统,另外还包括定义在项目生命周期阶段的插件(plugin)以及目标(goal)。

当我们使用 Maven 的使用,通过一个自定义的项目对象模型,pom.xml 来详细描述我们自己的项目。

Maven 中的有两大核心:

  • 依赖管理:对 jar 的统一管理(Maven 提供了一个 Maven 的中央仓库,mvnrepository.com/,当我们在项目中添加完… 会自动去中央仓库下载相关的依赖,并且解决依赖的依赖问题)
  • 项目构建:对项目进行编译、测试、打包、部署、上传到私服等

为什么使用 Maven?

由于 Java 的生态非常丰富,无论你想实现什么功能,都能找到对应的工具类,这些工具类都是以 jar 包的形式出现的,例如 Spring,SpringMVC、MyBatis、数据库驱动,等等,都是以 jar 包的形式出现的,jar 包之间会有关联,在使用一个依赖之前,还需要确定这个依赖所依赖的其他依赖,所以,当项目比较大的时候,依赖管理会变得非常麻烦臃肿,这是 Maven 解决的第一个问题。

Maven 还可以处理多模块项目。简单的项目,单模块分包处理即可,如果项目比较复杂,要做成多模块项目,例如一个电商项目有订单模块、会员模块、商品模块、支付模块...,一般来说,多模块项目,每一个模块无法独立运行,要多个模块合在一起,项目才可以运行,这个时候,借助 Maven 工具,可以实现项目的一键打包。

Maven能帮助开发者完成以下工作:

  • 构建
  • 文档生成
  • 报告
  • 依赖
  • 发布

Maven 仓库

仓库的由来

在Maven世界中,任何一个依赖、插件或者项目构建的输出,都可以称为构件。得益于坐标机制,任何Maven项目使用任何一个构件的方式都是完全相同的。在此基础上,Maven可以在某个位置统一存储所有Maven项目共享的构件,这个统一的位置就是仓库。

实际的Maven项目将不再各自存储其依赖文件,它们只需要声明这些依赖的坐标,在需要的时候(例如,编译项目的时候需要将依赖加入到classpath中),Maven会自动根据坐标找到仓库中的构件,并使用它们。

为了实现重用,项目构建完毕后可生成的构件也可以安装或者部署到仓库中,供其他项目使用。

仓库的布局

任何一个构件都有其唯一的坐标,根据这个坐标可以定义其在仓库中的唯一存储路径,这便是Maven的仓库布局方式。 该路径与坐标对应关系为groupId/artifactId/version/artifactId-version.packaging。 举个例子,比如下面这个分页插件依赖如下:

<dependency>
      <groupId>com.github.pagehelper</groupId>
      <artifactId>pagehelper-spring-boot-starter</artifactId>
      <version>1.1.0</version>
</dependency>

那它对应的仓库的路径就是这样:

Maven仓库是基于简单文件系统存储的,我们也理解其存储方式、因此,当遇到一些与仓库相关的问题时,可以很方便的查找相关文件,方便定位问题。

仓库分类

仓库调用顺序

仓库调用顺序:

  • 首先在本地资源库中查找依赖,若不存在,则进入下一步,否则,退出;
  • 然后在 远程仓库(私服) 中查找依赖,若不存在,则进入下一步,否则,退出;
  • 最后在 中央仓库中查找依赖,若不存在,则提示错误信息,退出。

本地仓库

一般来说,在Maven项目目录下,没有诸如lib/这样用来存放依赖文件的目录。当Maven在执行编译或测试时,如果需要使用依赖文件,它总是基于坐标使用本地仓库的依赖文件。

默认情况下,不管在Window还是Linux下,每个用户在自己用户目录下都有一个路径名为.m2/repository/的仓库目录。 如果你想自定义本地仓库目录地址。你可以编辑文件~/.m2/settings.xml,设置localRepository元素的值为想要的仓库地址,例如:

<settings>
<localRepository>D:\java\repository\</localRepository>
</settings>

建议不要修改本地仓库路径,采用默认方式即可。

中央仓库(远程)

由于最原始的本地仓库是空的,Maven必须知道至少一个可用的远程仓库,才能在执行Maven命令的时候下载到需要的构件。中央仓库就是这样一个默认的远程仓库,Maven的安装文件自带了中央仓库的配置。

中央仓库包含了这个世界上绝大多数流行的开源Java构件,以及源码、作者信息、SCM,信息、许可证信息等,每个月这里都会接受全世界Java程序员大概1亿次的访问,它对全世界Java开发者的贡献由此可见一斑。

私服仓库(远程)

私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的Maven用户使用。当Maven需要下载构件的时候,它从私服请求,如果私服上不存在该构件,则从外部的远程仓库下载,缓存在私服上之后,再为Maven的下载请求提供服务。因此,一些无法从外部仓库下载到的构件也能从本地上传到私服上供大家使用。

私服的好处:

  • 节省自己的外网速度
  • 加速Maven构建
  • 部署第三方构建
  • 提高稳定性,增强控制
  • 降低中央仓库的负荷

远程仓库配置相关内容

远程仓库配置

在平时的开发中,我们往往不会使用默认的中央仓库,默认的中央仓库访问的速度比较慢,访问的人或许很多,有时候也无法满足我们项目的需求,可能项目需要的某些构件中央仓库中是没有的,而在其他远程仓库中有,如JBoss Maven仓库。这时,可以在pom.xml中配置该仓库,代码如下:

<repositories>
  <repository>
    <snapshots>
      <enabled>false</enabled>
    </snapshots>
    <id>central</id>
    <name>maven-release-virtual</name>
    <url>https://xiaomi_xxx/artifactory/maven-release-virtual</url>
  </repository>
  <repository>
    <snapshots>
      <enabled>false</enabled>
    </snapshots>
    <id>miremote</id>
    <name>maven-remote-virtual</name>
    <url>https://xiaomi_xxx/artifactory/maven-remote-virtual</url>
  </repository>
  <repository>
    <snapshots />
    <id>snapshots</id>
    <name>maven-snapshot-virtual</name>
    <url>https://xiaomi_xxx/artifactory/maven-snapshot-virtual</url>
  </repository>
</repositories>
  • **repository:**在repositories元素下,可以使用repository子元素声明一个或者多个远程仓库。
  • **id:**仓库声明的唯一id,尤其需要注意的是,Maven自带的中央仓库使用的id为central,如果其他仓库声明也使用该id,就会覆盖中央仓库的配置。
  • **snapshots:用来控制Maven对于快照版构件的下载权限。

远程仓库认证

大部分的远程仓库不需要认证,但是如果是自己内部使用,为了安全起见,还是要配置认证信息的。

配置认证信息和配置远程仓库不同,远程仓库可以直接在pom.xml中配置,但是认证信息必须配置在settings.xml文件中。这是因为pom往往是被提交到代码仓库中供所有成员访问的,而settings.xml一般只存在于本机。因此,在settings.xml中配置认证信息更为安全。

<servers>
  <server>
    <username>louzai</username>
    <password>xxx</password>
    <id>central</id>
  </server>
  <server>
    <username>louzai</username>
    <password>xxx</password>
    <id>snapshots</id>
  </server>
</servers>

这里除了配置账号密码之外,关键的就是id了,这个id要跟你在pom.xml里面配置的远程仓库repository的id一致,正是这个id将认证信息与仓库配置联系在了一起。

镜像

如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像。用过Maven的都知道,国外的中央仓库用起来太慢了,所以可以选择自己的镜像。

<mirrors>
  <mirror>
      <id>others</id>
      <mirrorOf>*,!central,!miremote,!snapshots</mirrorOf>
      <url>https://pkgs.d.xiaomi.net/artifactory/maven-remote-virtual</url>
  </mirror>
</mirrors>

这里的含义是,如果不是这3个仓库central、miremote和snapshots,都会去这个镜像中去下载构建,介绍下mirrorOf配置的各种选项:

<mirrorOf>*<mirrorOf>:匹配所有远程仓库。
<mirrorOf>external:*<mirrorOf>:匹配所有远程仓库,使用localhost的除外,使用file://协议的除外。也就是说,匹配所有不在本机上的远程仓库。
<mirrorOf>repo1,repo2<mirrorOf>:匹配仓库repo1h和repo2,使用逗号分隔多个远程仓库。
<mirrorOf>*,!repo1<mirrorOf>:匹配所有远程仓库,repo1除外,使用感叹号将仓库从匹配中排除。

需要注意的是,由于镜像仓库完全屏蔽了被镜像仓库,当镜像仓库不稳定或者停止服务的时候,Maven仍将无法访问被镜像仓库,因而将无法下载构件。

“远程仓库配置相关内容”,里面分成3块内容,其实我是将小米的Maven默认配置文件内容Copy出来,然后给大家分开讲解,未写这篇文章前,其实我也不懂,现在终于明白了。

欢迎大家多多点赞,更多文章,请关注微信公众号“楼仔进阶之路”,点关注,不迷路~~

楼仔

2021/07/18  阅读:60  主题:橙心

作者介绍

楼仔