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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 开始以为Maven需要掌握的东西很少,结果发现还是有些内容的。Maven实操的内容比较多,我就先专门通过本篇文章,对Maven进行简单介绍,然后重点讲解Maven仓库相关知识。感觉Maven相对简单,网上相关的资料也很多,那我为啥还需要专门写这个系列呢?其实主要还是记录自己的学习轨迹,便于后续查询学习内容,仅此而已!

UTGDVF}YWTOVHB1%5~O5G(1.jpg

介绍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>

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

4A]$NV%R`6P932)[_7U5%VP.jpg

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

仓库分类

3[A@{EN`)Q]M%$4F}FT)9NI.png


仓库调用顺序

仓库调用顺序:

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

image.gif@}_GD[MO(81EZ9I[3ZB7`7G.png


本地仓库

一般来说,在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出来,然后给大家分开讲解,未写这篇文章前,其实我也不懂,现在终于明白了。

相关实践学习
通过容器镜像仓库与容器服务快速部署spring-hello应用
本教程主要讲述如何将本地Java代码程序上传并在云端以容器化的构建、传输和运行。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
24天前
|
敏捷开发 Java 持续交付
阿里云云效产品使用合集之maven仓库是否可以代替自建的Nexus
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
2天前
|
Java Linux Maven
|
14天前
|
Java Linux Maven
Maven 仓库
Maven 仓库
|
4天前
|
Java Linux Maven
|
6天前
|
Java Linux Maven
|
10天前
|
Java Linux Maven
|
8天前
|
Java Linux Maven
|
12天前
|
Java Linux Maven
|
16天前
|
存储 Java Linux
Maven 仓库
Maven仓库是存储项目依赖库的位置,用于管理各种构件如JAR文件。Maven支持三种类型的仓库:本地、中央和远程。本地仓库默认位于用户目录下的`.m2/repository/`,首次运行Maven命令时自动创建,也可通过settings.xml文件自定义路径。中央仓库由Maven社区维护,包含大量常用开源Java库及其相关信息,无需配置即可通过网络访问,适用于大多数Java项目的依赖需求,可通过http://search.maven.org/#browse浏览和搜索构件。
|
18天前
|
存储 缓存 Java
Maven 仓库
Maven仓库是存储项目依赖的第三方库的位置,用于管理这些库(主要为JAR文件,也包括WAR、ZIP、POM等)。Maven支持三种类型的仓库:本地、远程和中央。本地仓库默认位于用户目录下的`.m2/repository/`,首次执行Maven命令时创建,用于缓存和提供构建所需的构件;中央仓库由Maven社区维护,包含大量常用开源Java库及其相关信息,无需额外配置,但需联网访问,可通过`http://search.maven.org/#browse`浏览其内容。