Maven仓库管理

摘要:Maven本地仓库远程仓库仓库配置仓库认证镜像

为什么需要仓库

在Maven中任何一个依赖插件或者项目输出都称为构件,任何一个构件都有一组唯一标识。仓库的作用就是对这些构件进行统一管理,避免磁盘存储重复构件的浪费,仓库可以在某一位置同意存储所有Maven项目共享的构件,在需要的时候Maven会自动根据坐标找到仓库中的构件并使用它们。

仓库布局

任何一个构件都有唯一坐标,根据坐标可以定义其在仓库中的唯一存储路径,路径和坐标的大只关系为groupId/artifactId/version/artifactId-version.packaging

dependency>
            <groupId>org.apache.kafka</groupId>
            <artifactId>kafka_2.11</artifactId>
            <version>0.10.0.0</version>
        </dependency>
root@ubuntu:/root/.m2/repository/org/apache/kafka/kafka_2.11/0.10.0.0# tree
.
├── kafka_2.11-0.10.0.0.jar
├── kafka_2.11-0.10.0.0.jar.sha1
├── kafka_2.11-0.10.0.0.pom
├── kafka_2.11-0.10.0.0.pom.sha1
└── _remote.repositories

其中路径是/org/apache/kafka/kafka_2.11/0.10.0.0分别代表groupIdartifactIdversion,目录下kafka_2.11-0.10.0.0.jar为依赖。

仓库的分类

仓库分为两类:本地仓库远程仓库,Maven根据坐标寻找构件先从本地仓库开始找,如果有就直接用,没有或者需要查看是否有更新的构件版本就去远程仓库找,在远程仓库发现对应构件之后下载到本地仓库,如果本地仓库和远程仓库都没有Maven会报错。
远程仓库有分为中央仓库私服其他公共库,默认本地找不到会去中央仓库,私服是一种特殊的远程仓库,为了节省宽带时间应该在局域网内架设一个私有的仓库服务器,用其代理所有的外部远程仓库,内部的项目还能部署带私服上供其他项目使用。除了中央仓库和私服还有很多其他公开的远程私服,Maven的仓库分类如下:

Maven仓库分类.png

本地仓库

在Maven项目下没有lib/文件夹存放项目依赖,Maven需要编译执行项目时总是基于依赖坐标从本地仓库找到依赖文件。默认情况下仓库目录在用户名根目录下的.m2/repository/下,可以在.m2/下的settings.xml文件(需要先复制一份过去)中修改localRepository标签本地仓库位置

<localRepository>/home/java/repository</localRepository>

一个构件只有在本地仓库中后才能在其他Maven项目中使用,如何将构件引入本地仓库,最常见的是从远程仓库下载和将本地项目安装到本地仓库。
编辑一个项目安装到本地仓库,在新的项目中通过仓库坐标引入这个安装的项目。

测试安装.png

安装命令

mvn clean install
root@ubuntu:~/.m2/repository/org/mycom/example# tree
.
└── InstallTest
    ├── 1.0-SNAPSHOT
    │   ├── InstallTest-1.0-SNAPSHOT.jar
    │   ├── InstallTest-1.0-SNAPSHOT.pom
    │   ├── maven-metadata-local.xml
    │   └── _remote.repositories
    └── maven-metadata-local.xml

在新项目中引用该坐标

<dependency>
      <groupId>org.mycom.example</groupId>
      <artifactId>InstallTest</artifactId>
      <version>1.0-SNAPSHOT</version>
    </dependency>

在脚本中调用该依赖的方法returnString

package org.example.FPGrowth

import org.mycom.example.utils.Main.returnString

object Test {
  def main(args: Array[String]): Unit = {
    val a = returnString()
    println(a)  // 输出"a"
  }
}

中央仓库

Maven的安装文件自带了中央仓库的配置,打开/usr/share/maven/lib下的maven-model-builder-3.x.jar下的pom-4.0.0.xml文件,其中https://repo.maven.apache.org/maven2就是中央仓库的地址。

  <repositories>
    <repository>
      <id>central</id>
      <name>Central Repository</name>
      <url>https://repo.maven.apache.org/maven2</url>
      <layout>default</layout>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
  </repositories>

这段pom是所有Maven项目都会继承的超级pom,其中使用id: central作为中央仓库的唯一标识,snapshots标签enabled为false说明不从中央仓库下载快照版本的构件。

私服

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

私服的用途.png

即使在一台直接链接Internet的个人机器上也应该使用私服,私服的优势

  • 节省外网宽带: 大量对于外部仓库的重复请求很消耗宽带,私服代理外部仓库后对于重复构建不需要重复下载,降低外网宽带压力
  • 加速Maven构建: Maven在执行构建的时候不停的检查远程仓库数据,当Maven只需要检查私服数据时,构建速度大大提升。
  • 部署第三方构件: 当组织内部生成的私有构件,肯定在外部仓库无法获得,可以将这些构件上传到私服,供内部其他Maven项目使用。
  • 提高稳定性,增强管理;当远程仓库不稳定的时候,就算Internet不稳定由于在私服缓存了大量构件,所以Maven依然可以运行,另外某些私服软件提供额外的功能比如权限管理,因此获得更高级的控制。
  • 降低中央仓库的负荷: 建立私服之后下载只会在内网范围内,私服对于中央仓库只有一次下载

远程仓库的配置

当默认的中央仓库无法满足项目需求时,项目需要的构件可能存在在另一个远程仓库中,可在项目的pom中进行配置

<repositories>
    <repository>
      <id>scala-tools.org</id>
      <name>Scala-Tools Maven2 Repository</name>
      <url>http://scala-tools.org/repo-releases</url>
    </repository>
  </repositories>

使用repositoriesrepository声明需要引入的远程的中央仓库,仓库的id都是唯一的,如果这个id和中央仓库的idcentral一致就会覆盖掉默认的中央仓库,url指向仓库地址。repository下有id的同级元素releasessnapshots,分别代表发布版本构件和快照版本构件,配合子标签enabled标签的true/false使用,代表下载的选择。releasessnapshots还有一个子元素updatePolicy,updatePolicy用来配置Maven从远程仓库检查更新的频率,daily每天一次,never从不检查更新,always每次构建都更新,主要是检查快照版本是否有更新。

远程仓库的认证

大部分远程仓库无需认证直接访问,但是有时出于安全考虑需要提供认证信息才能远程访问,比如组织内部的Maven仓库需要提供一组用户名密码才能访问。认证信息配置在settings.xml文件中,因为pom可能会提交到代码仓库,但是settings.xml只会留在本地,所以放在settings.xml中更安全。

<servers>
     <server>
        <id>myproject</id>
        <username>admin</username>
        <password>admin</password>
     </server>
  </servers>

使用serversserver进行信息认证,id是要连接的仓库和pom中的id配置的一致,usernamepassword分别提供用户名和密码,其中id将仓库配置和仓库认证联系在一起。

Maven从仓库解析依赖的机制

(1): 当依赖范围是system时,Maven直接从本地文件系统解析构件
(2): 根据依赖坐标计算仓库路径,先从本地找,找不到去远程仓库
(3): 找远程仓库时,如果依赖版本是显式的发布版本,遍历所有远程仓库发现后下载解析使用
(4): 如果依赖版本是RELEASE或者LATEST则请求远程仓库计算这两个值的真实值,再在本地或者远程找
(5): 如果依赖版本是SNAPSHOT,读取远程仓库或者最新的快照版本,再从本地读取或者远程下载

镜像配合私服

如果仓库X可提供仓库Y的所有构件那么就认为仓库X就是仓库Y的一个镜像,可以在给指定的远程仓库设置

  <mirrors>
        <mirror>
          <id>maven.net.cn</id>
          <name>china maven mirror</name>
          <url>http://maven.oschina.net/content/groups/public</url>
          <mirrorOf>central</mirrorOf>
        </mirror>
  </mirrors>

通过mirrorsmirror指定镜像,mirrorOf指定为中央仓库central的镜像,镜像更为常用的做法是结合私服使用

  <servers>
     <server>
        <id>myproject</id>
        <username>admin</username>
        <password>admin</password>
     </server>
  </servers>

  <mirrors>
        <mirror>
          <id>myproject</id>
          <mirrorOf>*</mirrorOf>
          <url>http://192.168.60.72:8081/nexus/content/groups/myproject-group/</url>
        </mirror>
  </mirrors>

mirrorOf为*,表示该配置是所有maven仓库的镜像,任何对于远程仓库的请求都会被转至这个url,如果该镜像需要认证则走server中的用户名和密码。

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

推荐阅读更多精彩内容