maven仓库详解

来源:互联网 发布:js生成随机数 编辑:程序博客网 时间:2024/05/20 04:13

1、何为maven仓库

在Maven中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件。

Maven在某个统一的位置存储所有项目的共享的构件,这个统一的位置,我们就称之为仓库。(仓库就是存放依赖和插件的地方)
任何的构件都有唯一的坐标,Maven根据这个坐标定义了构件在仓库中的唯一存储路径,
解读Maven在仓库中的存储路径:
1.基于groupId准备路径,将句点分隔符转成路径分隔符,就是将 "." 转换成 "/" ; example: org.testng --->org/testng
2.基于artifactId准备路径,将artifactId连接到后面:org/testng/testng
3.使用version准备路径,将version连接到后面:org/testng/testng/5.8
4.将artifactId于version以分隔符连字号连接到后面:org/testng/testng/5.8/tesng-5.8
5.判断如果构件有classifier,就要在 第4项 后增加 分隔符连字号 再加上 classifier,org/testng/testng/5.8/tesng-5.8-jdk5
6.检查构件的extension,如果extension存在,则加上句点分隔符和extension,而extension是由packing决定的,org/testng/testng/5.8/tesng-5.8-jdk5.jar

到这里我们就明白了Maven 对于构件存储的细节。

2、仓库分类

对于maven来说,仓库只有两类:本地仓库和远程仓库。当maven根据坐标寻找构件的时候,它首先会查看本地仓库,如果本地仓库存在此构件,则直接使用。如果本地仓库不存在此构件,或者需要查看是否有更新的构件版本,Maven会去远程仓库查找,发现需要的构件之后,下载到本地仓库再使用。如果本地仓库和远程仓库都没有需要的构件,Maven就会报错。远程仓库又分为3种:
  • 中央仓库
  • 私服
  • 其他公共库

3、本地仓库

顾名思义,就是Maven在本地存储构件的地方。注:maven的本地仓库,在安装maven后并不会创建,它是在第一次执行maven命令的时候才被创建,maven本地仓库的默认位置:无论是Windows还是Linux,在用户的目录下都有一个.m2/repository/的仓库目录,这就是Maven仓库的默认位置,如何更改maven默认的本地仓库的位置:这里要引入一个新的元素:localRepository,它是存在于maven的settings.xml文件中。

3.1更改配置用户范围的本地仓库

先在/.m2/目录下创建settings.xml文件,然后在~/.m2/settings.xml,设置localRepository元素的值为想要的仓库地址。

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">  <!-- localRepository   | The path to the local repository maven will use to store artifacts.   |   | Default: ${user.home}/.m2/repository-->  <localRepository>D:/myworkspace/maven_repository</localRepository>    <!-- interactiveMode   | This will determine whether maven prompts you when it needs input. If set to false,   | maven will use a sensible default value, perhaps based on some other setting, for   | the parameter in question.   |   | Default: true  <interactiveMode>true</in在M2_HOME/conf/settings.xml(D:\soft\maven\apache-maven-3.3.3\confsettings.xml\settings.xml)中更改配置,更改配置的方法同上注:此时更改后,所有的用户都会受到影响,而且如果maven进行升级,那么所有的配置都会被清除,所以要提前复制和备份M2_HOME/conf/settings.xml文件故:一般情况下不推荐配置全局的settings.xml...
这时候,maven的本地仓库地址就变成了 D:\maven_new_repository ,注:此时配置的maven的本地仓库是属于用户范围的。默认情况下,~/.m2/settings.xml文件是不存在的,用户需要从maven安装目录复制$M2_HOME/conf/settings.xml文件再进行编辑。

3.2更改配置全局范围的本地仓库

在M2_HOME/conf/settings.xml(D:\soft\maven\apache-maven-3.3.3\confsettings.xml\settings.xml)中更改配置,更改配置的方法同上。
注:此时更改后,所有的用户都会受到影响,而且如果maven进行升级,那么所有的配置都会被清除,所以要提前复制和备份M2_HOME/conf/settings.xml文件,故:一般情况下不推荐配置全局的settings.xml。

4、远程仓库

4.1中央仓库

由于最原始的本地仓库是空的,maven必须知道至少一个可用的远程仓库,才能在执行Maven命令的时候下载到需要的构件。中央仓库是默认的远程仓库,maven在安装的时候,自带的就是中央仓库的配置。所有的maven项目都会继承超级pom。包含下面配置的pom我们就称为超级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>

4.2私服

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

5、远程仓库的配置

配置远程仓库将引入新的配置元素:<repositories> <repository>,在<repositories>元素下,可以使用 <repository>子元素声明一个或者多个远程仓库。例如:

<repositories>          <repository>              <id>jboss</id>              <name>JBoss Repository</name>              <url>http://repository.jboss.com/maven2/</url>              <releases>                  <updatePolicy>daily</updatePolicy><!-- never,always,interval n -->                  <enabled>true</enabled>                  <checksumPolicy>warn</checksumPolicy><!-- fail,ignore -->              </releases>              <snapshots>                  <enabled>false</enabled>              </snapshots>              <layout>default</layout>          </repository>  </repositories>
如何将生成的项目部署到远程仓库?
完成这项工作,也需要在POM中进行配置,这里有新引入了一个元素:<distributionManagement>。
distributionManagement包含了2个子元素:repository和snapshotRepository, 前者表示发布版本构件的仓库,后者表示快照版本的仓库,这两个元素都需要配置 id(该远程仓库的唯一标识),name,url(表示该仓库的地址)向远程仓库中部署构件,需要进行认证。配置同上。

<distributionManagement>        <repository>            <id>releases</id>            <name>public</name>            <url>http://59.50.95.66:8081/nexus/content/repositories/releases</url>        </repository>        <snapshotRepository>            <id>snapshots</id>            <name>Snapshots</name>            <url>http://59.50.95.66:8081/nexus/content/repositories/snapshots</url>        </snapshotRepository></distributionManagement>

配置正确后运行: mvn clean deploy

6、镜像

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

<mirrors>     <mirror>      <id>maven.oschina.net</id>      <name>maven mirror in China</name>      <url>http://maven.oschina.net/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://183.238.2.182:8081/nexus/content/groups/public/</url>          <mirrorOf>*</mirrorOf>      </mirror>  </mirrors>


原创粉丝点击