当前位置 : 首页 » 文章分类 :  开发  »  Apache-Maven-仓库

Apache-Maven-仓库

[TOC]


概述

在Maven中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件。
Maven在某个统一的位置存储所有项目的共享的构件,这个统一的位置,我们就称之为仓库,即仓库就是存放依赖和插件的地方
Maven仓库分为两大类:1.本地仓库 2.远程仓库,远程仓库又可分为3种:中央仓库、私服、其它公共库


构件存储路径解析

任何的构件都有唯一的坐标,Maven根据这个坐标定义了构件在仓库中的唯一存储路径。
以构件jms-spring-api

<dependency>
    <groupId>com.masikkk.jms</groupId>
    <artifactId>jms-spring-api</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <classifier>jdk17</classifier>
</dependency>

为例,存储路径解析算法如下:

  • 1、基于groupId准备路径,将句点分隔符转成路径分隔符,就是将”.”转换成”/“,例如:com.masikkk.jms解析为com/masikkk/jms
  • 2、基于artifactId准备路径,将artifactId连接到后面:com/masikkk/jms/jms-spring-api
  • 3、使用version准备路径,将version连接到后面:com/masikkk/jms/jms-spring-api/0.0.1-SNAPSHOT
  • 4、将artifactId和version以分隔符连字号连接到后面:com/masikkk/jms/jms-spring-api/0.0.1-SNAPSHOT/jms-spring-api-0.0.1-SNAPSHOT
  • 5、判断如果构件有classifier,就要在第4项后增加分隔符连字号,再加上classifier:com/masikkk/jms/jms-spring-api/0.0.1-SNAPSHOT/jms-spring-api-0.0.1-SNAPSHOT-jdk17
  • 6、检查构件的extension,如果extension存在,则加上句点分隔符和extension,而extension是由packaging决定的,默认packaging方式为jar则:com/masikkk/jms/jms-spring-api/0.0.1-SNAPSHOT/jms-spring-api-0.0.1-SNAPSHOT-jdk17.jar

SNAPSHOT版本

Maven版本可以包含一个字符串字面量来表示项目正处于活动的开发状态。如果一个版本包含字符串“SNAPSHOT”,Maven就会在安装或发布这个组件的时候将该符号展开为一个日期和时间值,转换为UTC(协调世界时)。SNAPSHOT版本在项目活动的开发过程中使用。如果你的项目依赖的一个组件正处于开发过程中,你可以依赖于一个SNAPSHOT版本,在你运行构建的时候Maven会定期的从仓库下载最新的snapshot。作为一个默认设置,Maven不会从远程仓库检查SNAPSHOT版本,要依赖于SNAPSHOT版本,用户必须在POM中使用repository和pluginRepository元素显式的开启下载snapshot的功能当发布一个项目的时候,你需要解析所有对SNAPSHOT版本的依赖至正式发布的版本。如果一个项目依赖于SNAPSHOT,那么这个依赖很不稳定,它随时可能变化。发布到非snapshot的Maven仓库(如http://repo1.maven.org/maven2)的构件不能依赖于任何SNAPSHOT版本,因为Maven的超级POM对于中央仓库关闭了snapshot。SNAPSHOT版本只用于开发过程。

有时pom.xml中的版本号version的值会有-SNAPSHOT后缀,SNAPSHOT表示开发分支上的最新代码,SNAPSHOT版本不保证代码的稳定性和不变性;相反,release版本(即任何不带-SNAPSHOT后缀的版本)的代码是不变的。
也就是说,SNAPSHOT版本是release版之前的开发版,SNAPSHOT版的代码比它的release版“旧”。
在release过程中,版本号x.y-SNAPSHOT变为x.y,同时,release过程还会将开发版的版本号改为x.(y+1)-SNAPSHOT。例如,版本1.0-SNAPSHOT发布(release)后变为版本1.0,同时新的开发版本号变为1.1-SNAPSHOT.

What is a SNAPSHOT version?
https://maven.apache.org/guides/getting-started/index.html#What_is_a_SNAPSHOT_version


Maven本地仓库及配置

本地仓库,顾名思义,就是Maven在本地存储构件的地方。
注:Maven的本地仓库在安装maven后并不会创建,它是在第一次执行maven命令的时候才被创建
Maven本地仓库的默认位置:无论是Windows还是Linux,在用户家目录下都有一个.m2/repository/目录,这就是Maven仓库的默认位置,即~/.m2/repository,使用过程中这个目录里的文件会比较多,占用空间越来越大。

用户范围settings.xml配置

在~/.m2/目录下创建settings.xml文件(拷贝Maven安装目录中的conf/settings.xml),,使用<localRepository>配置项配置本地仓库位置:

<localRepository>D:\.m2\repository</localRepository>

例如上面配置,就把默认的本地仓库更改到D:.m2\repository这个目录(这个目录结构需要自己创建好)。同时还需要把这个settings.xml文件复制一份到D:.m2\目录下,即保证settings.xml和repository并列放在同层目录下

全局范围settings.xml配置

编辑maven安装目录/conf下的settings.xml配置文件可对所有用户产生影响,配置方法同用户settings.xml配置。


Maven远程仓库

中央仓库

中央仓库是默认的远程仓库,maven在安装的时候自带中央仓库配置,地址为:http://repo.maven.apache.org/maven2
在Super POM中可以看到中央仓库的配置:

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

中央仓库包含了绝大多数流行的开源Java构件,以及源码、作者信息、SCM、信息、许可证信息等。一般来说,简单的Java项目依赖的构件都可以在这里下载到。


私服仓库

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

Maven私服的特性:

  • 1、节省自己的外网带宽:减少重复请求造成的外网带宽消耗
  • 2、加速Maven构件:如果项目配置了很多外部远程仓库的时候,构建速度就会大大降低
  • 3、部署第三方构件:有些构件无法从外部仓库获得的时候,我们可以把这些构件部署到内部仓库(私服)中,供内部maven项目使用
  • 4、提高稳定性,增强控制:Internet不稳定的时候,maven构建也会变的不稳定,一些私服软件还提供了其他的功能
  • 5、降低中央仓库的负荷:maven中央仓库被请求的数量是巨大的,配置私服也可以大大降低中央仓库的压力

当前主流的maven私服:

  • 1、Apache的Archiva
  • 2、JFrog的Artifactory
  • 3、Sonatype的Nexus

搭建Nexus私服:


添加Maven远程仓库

前面我们看到Super POM中配置了ID为central的远程仓库,我们也可以在POM中配置其它的远程仓库。这样做的原因有很多,比如你有一个局域网的私服仓库,使用该仓库能大大提高下载速度,继而提高构建速度,也有可能你依赖的一个jar在central中找不到,它只存在于某个特定的公共仓库(比如中央仓库中就没有javax.jms:jms-1.1.jar这个包,需要额外配上JBoss远程仓库),这样你也不得不添加那个远程仓库的配置。

Maven中添加远程仓库有两种配置方法:

  • 1、在项目的pom.xml中添加<repositories>/<repository>配置,这只针对具体的某一个项目。
  • 2、在Maven的settings.xml中添加<profiles>/<profile>/<repositories>/<repository>配置,可对所有项目起作用。

在项目pom.xml中配置远程仓库

例如在项目的pom.xml中添加JBoss远程仓库:

<project>
... ...
<!-- 配置JBoss远程仓库 -->
<repositories>
    <repository>
        <id>jboss</id>
        <name>JBoss Repository</name>
        <url>https://repository.jboss.org/nexus/content/groups/public-jboss/</url>
        <releases>
            <enabled>true</enabled>
            <updatePolicy>daily</updatePolicy>
            <checksumPolicy>warn</checksumPolicy>
        </releases>
        <snapshots>
            <enabled>false</enabled>
            <checksumPolicy>warn</checksumPolicy>
        </snapshots>
        <layout>default</layout>
    </repository>
</repositories>
... ...
</project>
  • repository:在repositories元素下,可以使用repository子元素声明一个或者多个远程仓库。
  • id:仓库声明的唯一id,尤其需要注意的是,Maven自带的中央仓库使用的id为central,如果其他仓库声明也使用该id,就会覆盖中央仓库的配置。
  • name:仓库的名称,让我们直观方便的知道仓库是哪个,暂时没发现其他太大的含义。
  • url:指向了仓库的地址,一般来说,该地址都基于http协议,Maven用户都可以在浏览器中打开仓库地址浏览构件。
  • releases和snapshots:用来控制Maven对于发布版构件和快照版构件的下载权限。需要注意的是enabled子元素,该例中releases的enabled值为true,表示开启JBoss仓库的发布版本下载支持,而snapshots的enabled值为false,表示关闭JBoss仓库的快照版本的下载支持。根据该配置,Maven只会从JBoss仓库下载发布版的构件,而不会下载快照版的构件。
  • layout:元素值default表示仓库的布局是Maven2及Maven3的默认布局,而不是Maven1的布局。基本不会用到Maven1的布局。
  • 其他:对于releases和snapshots来说,除了enabled,它们还包含另外两个子元素updatePolicy和checksumPolicy。
    • 元素updatePolicy用来配置Maven从远处仓库检查更新的频率,默认值是daily,表示Maven每天检查一次。其他可用的值包括:never-从不检查更新;always-每次构建都检查更新;interval:X-每隔X分钟检查一次更新(X为任意整数)。
    • 元素checksumPolicy用来配置Maven检查校验和文件的策略。当构建被部署到Maven仓库中时,会同时部署对应的检验和文件。在下载构件的时候,Maven会验证校验和文件,如果校验和验证失败,当checksumPolicy的值为默认的warn时,Maven会在执行构建时输出警告信息,其他可用的值包括:fail-Maven遇到校验和错误就让构建失败;ignore-使Maven完全忽略校验和错误。

在settings.xml中配置远程仓库

settings.xml中不直接支持<repositories>配置项,需要放在<profile>中,并使用<activeProfiles>元素激活该profile,例如在settings.xml中添加JBoss远程仓库:

<settings>
  ...
  <profiles>
    ...
    <profile>
      <id>jboss-public-repository</id>
        <repositories>
            <repository>
                <id>jboss</id>
                <name>JBoss Repository</name>
                <url>https://repository.jboss.org/nexus/content/groups/public-jboss/</url>
                <releases>
                    <enabled>true</enabled>
                    <updatePolicy>daily</updatePolicy>
                    <checksumPolicy>warn</checksumPolicy>
                </releases>
                <snapshots>
                    <enabled>false</enabled>
                    <checksumPolicy>warn</checksumPolicy>
                </snapshots>
                <layout>default</layout>
            </repository>
        </repositories>
    </profile>
    ...
  </profiles>

  <!-- 激活profile-->
  <activeProfiles>
    <activeProfile>jboss-public-repository</activeProfile>
  </activeProfiles>
  ...
</settings>

远程仓库认证

大部分公共的远程仓库无须认证就可以直接访问,但我们在平时的开发中往往会架设自己的Maven远程仓库,出于安全方面的考虑,我们需要提供认证信息才能访问这样的远程仓库。
配置认证信息和配置远程仓库不同,远程仓库可以直接在pom.xml中配置,但是认证信息必须配置在settings.xml文件中。这是因为pom往往是被提交到代码仓库中供所有成员访问的,而settings.xml一般只存在于本机。因此,在settings.xml中配置认证信息更为安全。
例如:

<settings>
  ...
    <servers>
        <server>
            <id>pro-snapshot</id>
            <username>admin</username>
            <password>admin123</password>
        </server>
        <server>
            <id>pro-release</id>
            <username>admin</username>
            <password>admin123</password>
        </server>
    </servers>
  ...
</settings>

上面代码我们配置了2个远程仓库认证信息,一个id为pro-snapshot,另一个id为pro-release。Maven使用settings.xml文件中的<servers>元素及其子元素<server>配置仓库认证信息。认证用户名为admin,认证密码为admin123。这里的关键是id元素,settings.xml中<server>元素的id必须与pom.xml中需要认证的<repository>元素的id完全一致,正是这个id将认证信息与仓库配置联系在了一起


配置远程仓库的镜像

如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像。换句话说,任何一个可以从仓库Y获得的构件,都能够从它的镜像中获取。
举个例子,阿里云maven仓库 http://maven.aliyun.com/nexus/content/groups/public/ 是中央仓库 https://repo.maven.apache.org/maven2 在中国的镜像,由于地理位置的因素,该镜像往往能够提供比中央仓库更快的服务。因此,可以配置Maven使用该镜像来替代中央仓库。编辑settings.xml,代码如下:

<mirrors>
    <mirror>
        <id>nexus-aliyun</id>
        <name>Nexus aliyun</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        <mirrorOf>central</mirrorOf>
    </mirror>
</mirrors>

该例中,<mirrorOf>的值为central,表示该配置为中央仓库的镜像,任何对于中央仓库的请求都会转至该镜像,用户也可以使用同样的方法配置其他仓库的镜像。id表示镜像的唯一标识符,name表示镜像的名称,url表示镜像的地址。

关于镜像的一个更为常见的用法是结合私服。由于私服可以代理任何外部的公共仓库(包括中央仓库),因此,对于组织内部的Maven用户来说,使用一个私服地址就等于使用了所有需要的外部仓库,这可以将配置集中到私服,从而简化Maven本身的配置。在这种情况下,任何需要的构件都可以从私服获得,私服就是所有仓库的镜像。这时,可以配置这样的一个镜像:

<!--配置私服镜像-->
<mirrors>
    <mirror>
        <id>nexus</id>
        <name>internal nexus repository</name>
        <url>http://172.27.19.161:8081/nexus/content/groups/public/</url>
        <mirrorOf>*</mirrorOf>
    </mirror>
</mirrors>

该例中<mirrorOf>的值为星号,表示该配置是所有Maven仓库的镜像,任何对于远程仓库的请求都会被转至此nexus私服。如果该镜像仓库需要认证,则配置一个id为nexus的认证信息即可。

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


部署构件至远程仓库

我们使用自己的远程仓库的目的就是在远程仓库中部署我们自己项目的构件以及一些无法从外部仓库直接获取的构件。这样才能在开发时,供其他对团队成员使用。

Maven除了能对项目进行编译、测试、打包之外,还能将项目生成的构件部署到远程仓库中。首先,需要编辑项目的pom.xml文件。配置<distributionManagement>元素,例如:

<project>
    <distributionManagement>
        <repository>
            <id>pro-release</id>
            <name>Proj Release Repository</name>
            <url>http://172.27.19.161:8081/nexus/content/repositories/releases/</url>
        </repository>

        <snapshotRepository>
            <id>pro-snapshot</id>
            <name>Proj Snapshot Repository</name>
            <url>http://172.27.19.161:8081/nexus/content/repositories/snapshots/</url>
        </snapshotRepository>
    </distributionManagement>
</project>

<distributionManagement>包含<repository><snapshotRepository>子元素,前者表示发布版本(稳定版本)构件的仓库,后者表示快照版本(开发测试版本)的仓库。这两个元素都需要配置id、name和url,id为远程仓库的唯一标识,name是为了方便人阅读,关键的url表示该仓库的地址。
往远程仓库部署构件的时候,往往需要认证,配置认证的方式同上。
配置正确后,运行命令mvn clean deploy,Maven就会将项目构建输出的构件部署到配置对应的远程仓库,如果项目当前的版本是快照版本,则部署到快照版本的仓库地址,否则就部署到发布版本的仓库地址。


参考


上一篇 Apache-ActiveMQ

下一篇 Spring-测试相关注解

阅读
4,131
阅读预计16分钟
创建日期 2017-08-31
修改日期 2018-09-04
类别
百度推荐