Maven仓库如何搭建?保姆级教程

大家好,我是袁庭新。

Maven在某个统一的位置存储所有项目的构件,这个统一的位置,我们就称之为仓库。换言之,仓库就是存放依赖和插件的地方。

任何的构件都有唯一的坐标,该坐标定义了构件在仓库中的唯一存储路径。当Maven项目需要某些构件时,只要其POM文件中声明了这些构件的坐标,Maven就会根据这些坐标找自动到仓库中找到并使用它们。

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

1.仓库的分类

Maven仓库可以分为2个大类:

  • 本地仓库
  • 远程仓库

当Maven根据坐标寻找构件时,它会首先查看本地仓库,若本地仓库存在此构件,则直接使用;若本地仓库不存在此构件,Maven就会去远程仓库查找,若发现所需的构件后,则下载到本地仓库使用。如果本地仓库和远程仓库都没有所需的构件,则Maven就会报错。

远程仓库还可以分为3个小类:中央仓库、私服、其他公共仓库。

  • 中央仓库是由Maven社区提供的一种特殊的远程仓库,它包含了绝大多数流行的开源构件。在默认情况下,当本地仓库没有Maven所需的构件时,会首先尝试从中央仓库下载。
  • 私服是一种特殊的远程仓库,它通常设立在局域网内,用来代理所有外部的远程仓库。它的好处是可以节省带宽,比外部的远程仓库更加稳定。
  • 除了中央仓库和私服外,还有很多其他公共仓库,例如JBoss Maven库,Java.net Maven库和阿里云Maven仓库等等。

Maven仓库的分类如下图。

由于私服在实际开发中十分的常用,也特别重要,因此本节只稍做介绍,关于Maven私服的详细内容将在后续章节专题介绍。

2.本地仓库

Maven本地仓库实际上就是本地计算机上的一个目录(文件夹),它会在第一次执行Maven命令时被创建。

Maven本地仓库可以储存本地所有项目所需的构件。当Maven项目第一次进行构建时,会自动从远程仓库搜索依赖项,并将其下载到本地仓库中。当项目再进行构建时,会直接从本地仓库搜索依赖项并引用,而不会再次向远程仓库获取。

以Window系统为例说明,Maven本地仓库默认地址为C:%USER_HOME%.m2\repository ,但出于某些原因(例如C盘空间不够),我们通常会重新自定义本地仓库的位置。这时需要修改%MAVEN_HOME%\conf目录下的settings.xml文件,通过localRepository元素定义新的本地仓库地址。

1.进入apache-maven-3.8.4/conf目录下,找到settings.xml配置文件,我们在该文件中进行本地仓库的配置。

2.打开settings.xml文件,进行如下配置。

<!-- 选择一个磁盘目录,作为本地仓库。以下两种配置Maven本地仓库的方式,根据操作系统二选其一。 -->
<!-- 1.Windows系统配置Maven本地仓库 -->
<localRepository>H:\ProgramSoftware\localRepository</localRepository>

<!-- 2.Mac OS系统配置Maven本地仓库 -->
<localRepository>/Users/yuanxin/Documents/ProgramSoftware/localRepository</localRepository> 

3.在本台计算机上,上述配置的Maven本地仓库地址处创建【localRepository】文件夹,用于存放将来从远程仓库或中央仓库下载的插件和jar包。

构件只有储存在本地仓库中,才能被其他的Maven项目使用。构件想要进入本地仓库,除了从远程仓库下载到本地仓库外,还可以使用命令mvn install将本地项目的输出构件安装到本地仓库中。

3.中央仓库

中央仓库是由Maven社区提供的一种特殊的远程仓库,它包含了绝大多数流行的开源构件。在默认情况下,当本地仓库没有Maven所需的构件时,会首先尝试从中央仓库下载。

中央仓库具有如下特点:

  • 这个仓库由Maven社区管理
  • 不需要配置
  • 需要通过网络才能访问

我们可以通过Maven社区提供的URL地址:http://search.maven.org/#browse,浏览其中的构件。中央仓库包含了绝大多数流行的开源Java构件及其源码、作者信息和许可证信息等。一般来说,Maven项目所依赖的构件都可以从中央仓库下载到。

虽然中央仓库属于远程仓库的范畴,但由于它的特殊性,一般会把它与其他远程仓库区分开。我们常说的远程仓库,一般不包括中央仓库。

4.远程仓库

如果Maven在本地仓库和中央仓库中都找不到依赖的库文件,它就会停止构建过程并输出错误信息到IDE控制台。为避免这种情况的发生,Maven还提供了远程仓库的概念,它是一种由开发人员自己定制的仓库,其中包含了供其他项目使用的代码库或者构件。

国内开发人员由于网络原因,直接从中央仓库下载构件时,速度较慢或不稳定,我们通常会使用中央仓库的国内镜像站来解决该问题。

配置Maven镜像的方法也非常的简单,我们只需要在Maven安装目录中setting.xml文件的mirrors节点中,使用mirror标签添加镜像的相关信息即可。

目前国内使用最多,最稳定的中央仓库镜像分别是由[阿里云]和[华为云]提供的,它们的地址配置如下。

4.1 阿里云镜像

阿里云Maven中央仓库为阿里云云效提供的公共代理仓库,帮助研发人员提高研发生产效率,使用阿里云Maven中央仓库作为下载源,速度更快更稳定。

1.打开Maven的配置文件( windows机器一般在Maven安装目录的conf/settings.xml),在<mirrors></mirrors>标签中添加mirror子节点。进入apache-maven-3.8.4/conf目录下,在settings.xml文件中做如下配置。

<mirror>
  <id>aliyunmaven</id>
  <mirrorOf>*</mirrorOf>
  <name>阿里云公共仓库</name>
  <url>https://maven.aliyun.com/repository/public</url>
</mirror>

2.如果想使用其它代理仓库,可在<repositories></repositories>节点中加入对应的仓库使用地址。以使用central代理仓为例。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.ytx.edu</groupId>
  <artifactId>hello_maven</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>hello_maven</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <repositories>
    <repository>
      <id>central</id>
      <url>https://maven.aliyun.com/repository/central</url>
      <releases>
        <enabled>true</enabled>
      </releases>
      <snapshots>
        <enabled>true</enabled>
      </snapshots>
    </repository>
  </repositories>
</project>

说明:上述步骤1和步骤2针对Maven的配置远程仓库的配置,两种方式任选其一即可。

3.在你的pom.xml文件<denpendencies></denpendencies>节点中加入你要引用的文件信息。

<dependency>
  <groupId>[GROUP_ID]</groupId>
  <artifactId>[ARTIFACT_ID]</artifactId>
  <version>[VERSION]</version>
</dependency>

4.执行拉取命令。

mvn install

4.2 华为云镜像

打开Maven的配置文件( windows机器一般在Maven安装目录的conf/settings.xml),在<mirrors></mirrors>标签中添加mirror子节点。进入apache-maven-3.8.4/conf目录下,在settings.xml文件中做如下配置。

<mirror>
  <id>huaweicloud</id>
  <name>mirror from maven huaweicloud</name>
  <mirrorOf>central</mirrorOf>
  <url>https://repo.huaweicloud.com/repository/maven/</url>
</mirror>

以上配置中,mirrorOf的取值为central,表示该配置为中央仓库的镜像,所有对于中央仓库的请求都会转到该镜像。当然,我们也可以使用以上方式配置其他仓库的镜像。另外三个元素id、name和url分别表示镜像的唯一标识、名称和地址。

4.3 镜像与Maven私服配合使用

镜像通常会和Maven私服配合使用,由于Maven私服可以代理所有外部的公共仓库(包括中央仓库),因此对于组织内部的用户来说,使用一个私服就相当于使用了所有需要的外部仓库,这样就可以将配置集中到私服中,简化Maven本身的配置。这种情况下,用户所有所需的构件都可以从私服中获取,此时私服就是所有仓库的镜像。

<srttings>
  ...
  <mirrors>
    <mirror>
      <id>nexus</id>
      <mirrorOf>*</mirrorOf>
      <name>nexus</name>
      <url>http://localhost:8000/nexus/content/groups/ytx_repository_group/</url>
    </mirror>
  </mirrors>
  ...
</settings>

以上配置中,mirrorOf元素的取值为*,表示匹配所有远程仓库,所有对于远程仓库的请求都会被拦截,并跳转到url元素指定的地址。

为了满足一些较为复杂的需求,Maven还支持一些更为高级的配置。

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

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

5.Profiles配置

在settings.xml文件中的<profiles></profiles>标签中,添加一个<profile>标签,用于限定Maven项目默认的JDK版本。

<profiles>
  <!-- 在已有的profiles标签中添加profile标签 -->
  <profile>
    <id>jdk-11</id>
    <activation>
      <activeByDefault>true</activeByDefault>
      <jdk>11</jdk>
    </activation>
    <properties>
      <maven.compiler.source>11</maven.compiler.source>
      <maven.compiler.target>11</maven.compiler.target>
      <maven.compiler.compilerVersion>11</maven.compiler.compilerVersion>
    </properties>
  </profile>
</profiles>

<!-- 让增加的profile生效 -->
<activeProfiles>
  <activeProfile>jdk-11</activeProfile>
</activeProfiles>

6.总结

本文主要介绍了 Maven 仓库相关知识。Maven 仓库用于存放依赖和插件,分为本地仓库和远程仓库(中央仓库、私服、其他公共仓库)。本地仓库是本地计算机目录,默认地址可修改。中央仓库由 Maven 社区管理,默认优先从其下载构件。远程仓库可定制,国内常用阿里云和华为云镜像解决下载问题。还讲述了私服及镜像与私服配合使用,以及在 settings.xml 中通过 Profiles 配置限定项目默认 JDK 版本等内容,为 Maven 项目构建提供了重要的仓库管理指导。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容

  • 在Maven中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件。 Maven在某个统一的位置存储所有项目的...
    三也视界阅读 2,114评论 0 4
  • 在Maven世界中,依赖、插件、项目构建完成后输出的jar包都可以看作是一个构件,任何一个构件都有一组坐标唯一标识...
    SonyaBaby阅读 604评论 0 0
  • |-1-更新内容[6.从仓库解析依赖的机制(重要)] 1Maven仓库作用 仓库用来存储所有项目使用到构件,在ma...
    zlcook阅读 6,045评论 0 25
  • 在 Maven 的术语中,仓库是一个位置(place)。Maven 仓库是项目中依赖的第三方库,这个库所在的位置叫...
    41uLove阅读 6,946评论 2 3
  • maven坐标 maven的构件(jar包)是根据坐标来确定其在仓库的保存位置的。maven的坐标是通过以下元素来...
    Joepis阅读 546评论 0 4