Maven仓库

2014/03/04 Maven

Maven 仓库

构件:任何一个依赖、插件或者项目构件的输出,都可以成为构件。任何一个构件都有一组坐标唯一标示。 得益于坐标机制,任何Maven项目使用任务一个构件的方式都是一致的。在此基础上,Maven可以在某个位置统一存储所有Maven项目共享的构件,这个统一的位置就是仓库。实际的Maven项目将不再各自存储其依赖文件。它们只需要声明这些依赖的坐标,在需要的时候,Maven会自动根据坐标找到仓库中的构件,使用它们。 为了实现重用,项目构建完毕后生成的构件也可以安装或者部署到仓库中,供其他项目使用。

在 Maven 的术语中,仓库是一个位置(place)。

Maven 仓库是项目中依赖的第三方库,这个库所在的位置叫做仓库。

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

Maven 仓库能帮助我们管理构件(主要是JAR),它就是放置所有JAR文件(WAR,ZIP,POM等等)的地方。

Maven 仓库有三种类型:

  • 本地(local)
  • 中央(central)
  • 远程(remote)

中央仓库:Maven核心自带的远程仓库,包括了绝大数开源的构件。默认如果本地仓库没有的时候从中央仓库下载。

私服:一个特殊的远程仓库,为了节省宽带和时间,应该在局域网内架设一个私有的仓库服务器,用其代理所有外部的远程仓库,内部的项目还能部署到私服上供其他项目使用。

仓库的布局

任何一个构件都有其唯一的坐标,根据这个坐标可以定义其在仓库中的唯一存储路径,这便是Maven的仓库布局方式。路径和坐标的大致对应关系为groupId/artifactId/version/artifactId-version.packaging

本地仓库

Maven 的本地仓库,在安装 Maven 后并不会创建,它是在第一次执行 maven 命令的时候才被创建。

运行 Maven 的时候,Maven 所需要的任何构件都是直接从本地仓库获取的。如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件。

默认情况下,不管Linux还是 Windows,每个用户在自己的用户目录下都有一个路径名为 .m2/repository/ 的仓库目录。

Maven 本地仓库默认被创建在 %USER_HOME% 目录下。要修改默认位置,在 %M2_HOME%\conf 目录中的 Maven 的 settings.xml 文件中定义另一个路径。

<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>C:/MyLocalRepository</localRepository>
</settings>

当你运行 Maven 命令,Maven 将下载依赖的文件到你指定的路径中。

中央仓库

Maven 中央仓库是由 Maven 社区提供的仓库,其中包含了大量常用的库。

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

中央仓库的关键概念:

  • 这个仓库由 Maven 社区管理。
  • 不需要配置。
  • 需要通过网络才能访问。 要浏览中央仓库的内容,maven 社区提供了一个 URL:http://search.maven.org/#browse。使用这个仓库,开发人员可以搜索所有可以获取的代码库。

远程仓库

如果 Maven 在中央仓库中也找不到依赖的文件,它会停止构建过程并输出错误信息到控制台。为避免这种情况,Maven 提供了远程仓库的概念,它是开发人员自己定制仓库,包含了所需要的代码库或者其他工程中用到的 jar 文件。

Maven 依赖搜索顺序

当我们执行 Maven 构建命令时,Maven 开始按照以下顺序查找依赖的库:

  • 步骤 1 - 在本地仓库中搜索,如果找不到,执行步骤 2,如果找到了则执行其他操作。
  • 步骤 2 - 在中央仓库中搜索,如果找不到,并且有一个或多个远程仓库已经设置,则执行步骤 4,如果找到了则下载到本地仓库中以备将来引用。
  • 步骤 3 - 如果远程仓库没有被设置,Maven 将简单的停滞处理并抛出错误(无法找到依赖的文件)。
  • 步骤 4 - 在一个或多个远程仓库中搜索依赖的文件,如果找到则下载到本地仓库以备将来引用,否则 Maven 将停止处理并抛出错误(无法找到依赖的文件)。

远程仓库的配置

很多情况,默认的中央仓库无法满足项目需求,需要配置其他远程仓库。可以在pom中配置该仓库。

  • id:任何一个仓库的声明id必须是唯一的,尤其是注意Maven自带中央仓库的id是central,如果其他仓库声明也使用该id,就会覆盖中央仓库配置。
  • url:仓库地址
  • release:控制Maven对于发布版构件的下载。
  • snapshots:控制Maven对于快照版构件的下载。
  • enable:是否开启release或者snapshots的下载支持。
  • updatePolicy:用来配置Maven从远程仓库检查更新的频率,默认是daily,表示每天检查一次;never:从不检查更新;always:每次构建都检查更新;interval:X 每隔X分钟检查一次更新。
  • checksumPolicy:用来配置Maven检查检验和文件的策略。当构建被部署到Maven仓库中时,会同时部署对于应用的检验和文件,在下载构件的时候,Maven会验证校验和文件,如果失败?checksumPolicy默认值是warn,会执行构建时输出警告信息,其他可用——fail:遇到校验和错误就构件失败;ignore:完全忽略校验和错误。

远程仓库的认证

大部分无需验证就可直接访问,但是出于安全可以配置仓库用户名和密码,所以需要认证。

配置认证信息和配置仓库信息不同,仓库信息可以直接配置在POM文件中,但是认证信息必须配置在settings.xml文件中。这是因为POM往往被提交代码仓库供所有成员访问,而settings.xml一般只放在本机,所以更安全。

id:必须和POM中需要认证的Repository元素的id完全一致。正是这个id将认证信息和仓库配置联系在一起。

username:你懂得 password:你懂得

部署至远程仓库

Maven除了能对项目进行编译、测试、打包之外,还能降项目生成的构建部署到仓库中。

(1)首先编辑项目的pom.xml文件,配置元素

distributionManagement包含repository和snapshotRepository子元素,前者发布版本构建的仓库,后者表示快照版本的仓库。这两个元素下都有id、name、url标签。id是仓库的唯一标示,name是为了方便人阅读,url表示该仓库的地址。

(2)配置正确后在命令行运行mvn clean deploy,Maven就会将项目构件部署带配置对应的远程仓库,如果项目当前的版本是快照版本,则部署到快照版本仓库地址,否则就部署到发布版本仓库地址。

Maven 阿里云(Aliyun)仓库

Maven 仓库默认在国外, 国内使用难免很慢,我们可以更换为阿里云的仓库。

修改 maven 根目录下的 conf 文件夹中的 settings.xml 文件,在 mirrors 节点上,添加内容如下:

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

如果想使用其它代理仓库,可在 节点中加入对应的仓库使用地址。以使用 spring 代理仓为例:

<repository>
  <id>spring</id>
  <url>https://maven.aliyun.com/repository/spring</url>
  <releases>
    <enabled>true</enabled>
  </releases>
  <snapshots>
    <enabled>true</enabled>
  </snapshots>
</repository>

在你的 pom.xml 文件 节点中加入你要引用的文件信息:

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

执行拉取命令:

mvn install

镜像

如果仓库X可以提供仓库Y存储的所有内容,那么就可以说X是Y的一个镜像。 配置在settings.xml中。

标签的值是central,表示该配置为中央仓库的镜像,任何对于中央仓库的请求都会转至该镜像。id,name,url 和一般仓库配置无异。 * :所有仓库的镜像,任何对于远程仓库的请求都会转至镜像。 ## 仓库搜索服务 如何找到需要的依赖,我们一般知道类库的项目名称,需要知道Maven确切的Maven坐标;所以需要使用仓库搜索服务来根据关键字得到Maven坐标。 常用工具:Sonatype Nexus、Javana、MVNbrowser、MVNNrepository。

Search

    微信好友

    博士的沙漏

    Table of Contents