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文件,进行如下配置。

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地址: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文件中做如下配置。

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

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

xml 复制代码
<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>节点中加入你要引用的文件信息。

xml 复制代码
<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文件中做如下配置。

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本身的配置。这种情况下,用户所有所需的构件都可以从私服中获取,此时私服就是所有仓库的镜像。

xml 复制代码
<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版本。

xml 复制代码
<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 项目构建提供了重要的仓库管理指导。

相关推荐
檀越剑指大厂26 分钟前
【Java基础】使用Apache POI和Spring Boot实现Excel文件上传和解析功能
java·spring boot·apache
苹果酱056730 分钟前
Golang的网络流量分配策略
java·spring boot·毕业设计·layui·课程设计
孑么1 小时前
GDPU Android移动应用 重点习题集
android·xml·java·okhttp·kotlin·android studio·webview
未命名冀2 小时前
微服务面试相关
java·微服务·面试
Heavydrink2 小时前
ajax与json
java·ajax·json
阿智智2 小时前
纯手工(不基于maven的pom.xml、Web容器)连接MySQL数据库的详细过程(Java Web学习笔记)
java·mysql数据库·纯手工连接
fangxiang20082 小时前
spring boot 集成 knife4j
java·spring boot
王先生技术栈3 小时前
思维导图,Android版本实现
java·前端
生如夏花℡3 小时前
JAVA学习记录3
java·学习·idea
{⌐■_■}3 小时前
【gRPC】对称与非对称加解密和单向TLS与双向TLS讲解与go案例
java·servlet·golang