四. 仓库

1.什么是仓库

    在Maven任何一个依赖、插件或者项目构建的输出,都可以成为构件。Maven统一存储所有Maven项目共享构件的这个统一位置就是仓库。

 

2.仓库的布局

    任何一个构件都有其唯一的坐标,根据这个坐标可以定义其在仓库中的唯一存储路径。这便是Maven仓库布局方式。

    例如:log4j:log4j:1.2.17这一依赖对应路径为\repository\log4j\log4j\1.2.17

    其路径与坐标的大致对应关系为groupId/artifactId/version/artifactId-version.packaging

 

3.仓库的分类

    仓库分为两类:本地仓库和远程仓库。

    当Maven根据坐标寻找构件的时候,首先查看本地仓库,如果存在,直接使用;如果本地仓库不存在此构件,Maven就会去远程仓库查找,发现需要的构件之后,下载到本地仓库在使用。如果本地仓库和远程仓库都没有需要的构件,Maven就会报错。

特殊的远程仓库:

    •中央仓库:是Maven核心自带的远程仓库,包含了绝大部分开源的构件。

    •私服:是在局域网内架设的一个私有的仓库服务器,用其代理所有的外部的远程仓库,内部的项目还能部署到私服上供其他项目使用。

    •其他公开的远程仓库:常见的有Java.net Maven库(http://download.java.net/maven/2/)和JBoss Maven库(http://repository.jboss.org/maven2/)

 

 (1)本地仓库

    在~/.m2/settings.xml中指明了本地仓库

    Default: ~/.m2/repository

    可通过localRepository配置,例如

 

<settings>
    <localRepository>D:\repository</localRepository>
</settings

    注意:~/.m2/settings.xml文件是不存在的,需要从Maven安装目录 复制$M2_HOME/conf/setting.xml一份后,在进行编辑。不推荐直接修改全局setting.xml文件

 

构件进入仓库的方式:

    •从远程仓库下载

    •mvn clean install

 

(2)远程仓库

    安装好Maven后,如果不执行任何Maven命令,本地仓库目录是不存在的。当用户输入第一条Maven命令后,Maven才会创建本地仓库。

 

(3)中央仓库

    由于最原始的的本地仓库是空的,Maven必须知道至少一个可用的远程仓库,才能执行Maven命令的时候下载到的构件。

    $M2_HOME/lib/maven-model-builder-3.0.4.jar,然后访问maven-model-builder-3.0.4.jar\org\apache\maven\model\pom-4.0.0.xml,可以看到如下信息:

 

  <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>

    包含这段配置的文件是所有Maven项目都会继承的超级POM

 

    id:central 对中央仓库进行唯一标识;名称name:Central Repository;布局layout:default;snapshots-enabled-false表示不从该中央仓库下载快照版本的构件。

 

(4)私服

    私服是一种架设在局域网内的特殊的远程仓库,私服代理广域网上的远程仓库,供局域网内的Maven用户使用。

当Maven需要下载构件的时候,它从私服请求,如果不存在,则从外部的远程仓库下载,缓存在私服上之后,再为Maven的下载请求提供服务。此外,一些无法从外部仓库下载到的构件也能从本地上传到私服上。

    私服的作用:

    •节省自己的外网带宽;

    •加速Maven构建

    •部署第三方构件,当某个构件无法从任何一个外部远程仓库获得,比如组织内部私有构件、Oracle的JDBC驱动。建立私服后,可以将这些构件部署到这个内部仓库中,供内部的Maven项目使用;

    •提高稳定性,增强控制

    •降低中央仓库的负荷

 

4.远程仓库的配置

    可以在POM中或setting.xml中配置该仓库内容如下:

<project>
	<repositories>
		<repository>
			<id>jboss</id>
			<name>JBoss Repository</name>
			<url>http://repository.jboss.com/maven2/</url>
			<layout>default</layout>
			<releases>
				<enabled>true</enabled>
			</releases>
			<snapshots>
				<enabled>false</enabled>
			</snapshots>
		</repository>
	</repositories>
</project>

id:唯一标识,注意中央仓库ID为central,如果其它的仓库声明用使用该ID,就会覆盖中央仓库的配置。

layout:表示仓库的布局是Maven2及Maven3的默认布局。

releases:子元素enabled的值为true,表示开启JBoss仓库的发布版本下载支持。

snapshots:子元素enabled的值为false,关闭JBoss仓库的快照版本下载支持。

releases和snapshots:

updatePolicy子元素配置更新频率,默认值是daily,表示Maven每天检查一次。其他值never-从不检测更新;always-每次构建都检查更新;interval:X - 每隔X分钟检查一次更新;

checksumPolicy子元素用来配置Maven检查检验和文件的策略。当构件部署到Maven仓库中时,会验证校验和文件,如果校验和验证失败,默认为warn,输出警告信息;fail,构件失败;ignore,忽略

 

(1)远程仓库的认证

    认证信息必须配置在setting.xml中

 

<settings>
  ...
  <servers>
    <server>
      <id>deploymentRepo</id>
      <username>repouser</username>
      <password>repopwd</password>
    </server>
    <server>
      <id>siteServer</id>
      <privateKey>/path/to/private/key</privateKey>
      <passphrase>optional; leave empty if not used.</passphrase>
    </server>
  </servers>
  ...
</settings>

 

 

(2)部署至远程仓库

    需要编辑pom.xml文件

 

<project>
	<distributionManagement>
		<repository>
			<id>proj-release</id>
			<name>Proj Release Repository</name>
			<url>http://192.168.1.100/content/repository/proj-releases</url>
		</repository>
		<snapshotRepository>
			<id>proj-snapshot</id>
			<name>Proj Snapshot Repository</name>
			<url>http://192.168.1.100/content/repository/proj-snapshot</url>
		</snapshotRepository>
	</distributionManagement>
</project>

    distributionManagement包含repository和snapshotRepository子元素,前者表示发布版本构件仓库,后者表示快照版本构件仓库。两个子元素下都需要配置id、name、url。

往远程仓库部署的时候,需要认证,配置方式就是在setting.xml中创建一个server元素,其id与仓库的id匹配,并配置正确的认证信息,下载构件和部署构件认证配置方式是一样的。

部署命令:

mvn clean deploy

 

5.快照版本

    快照主要用于组织内部协同开发时使用,如果是SNAPSHOT版本,在发布到私服的过程中会为构件打上时间戳,例如:2.1-20091214.221414-13,其他对该构件有依赖的项目的项目可以在构件时进行检查。默认情况下每天检查一次(updatePolicy进行控制),也可以使用命令行-U参数强制让Maven检查更新

mvn clean install -U

 

6.从仓库解析依赖的机制

    Maven从仓库解析并使用依赖构件的规则如下:

    (1)当依赖范围是system的时候,Maven直接从本地系统解析构件;

    (2)根据依赖坐标计算仓库路径后,尝试直接从本地仓库寻找构件,如果发现相应构件,则解析成功;

    (3)在本地仓库不存在相应构件的情况下,如果依赖的版本是显示的发布版本构件,如1.2、2.1-beta-1等,则遍历所有的远程仓库,发现后,下载并解析使用;

    (4)如果依赖的版本是RELEASE或者LATEST,则基于更新策略读取所有远程仓库的元数据groupId/artifactId/maven-metadata.xml,将其与本地仓库的对应元数据合并后,计算出RELEASE或LATEST真实的值,然后基于这个真实的值检查本地或远程仓库,如步骤(2)和(3);

    (5)如果依赖的版本是SNAPSHOT,则基于更新策略读取所有远程仓库的元数据groupId/artifactId/version/maven-metadata.xml,将其与本地仓库的对应元数据合并后,得到最新快照版本的值,然后检查本地或远程仓库进行下载;

    (6)如果解析得到的构件版本是时间戳格式的快照,如1.41-20091104.121451-121,则复制其时间戳格式的文件至非时间戳格式,如SNAPSHOT,并使用该非时间戳格式的构件。

 

7.镜像

settings.xml中配置如下:

 

<settings>
  </mirrors>
	<mirror>
		<id>maven.net.cn</id>
		<name>one of the central mirrors in China</name>
		<url>http://maven.net.cn/content/groups/public/</url>
		<mirrorOf>central</mirrorOf>
	</mirror>
  </mirrors>
</settings>
    mirrorOf:指向被镜像仓库的ID;另外三个元素id、name、url与一般仓库无异。

 

 

更常见的用法是结合私服

<settings>
  </mirrors>
	<mirror>
		<id>internal-repository</id>
		<name>Internal Repository Manager</name>
		<url>http://192.168.1.100/maven2/</url>
		<mirrorOf>*</mirrorOf>
	</mirror>
  </mirrors>
</settings>
    <mirrorOf>*</mirrorOf>:对于任何远程请求都会转至http://192.168.1.100/maven2/;

    <mirrorOf>external:*</mirrorOf> :匹配所有远程仓库,使用localhost的除外,使用file://的除外。也就是匹配所有不在本机上的远程仓库;

    <mirrorOf>repo1,repo2</mirrorOf>:匹配repo1和repo2,使用逗号分隔多个远程仓库;

    <mirrorOf>*,!repo1</mirrorOf>:匹配所有远程仓库,repo1除外,使用感叹号将仓库从匹配中排除。

 

8.Maven的搜索服务

(1)Sonatype Nexus

地址:https://repository.sonatype.org/index.html#welcome

Nexus是最流行的开源Maven仓库管理软件,Sonatype架设的一个Nexus仓库实例。

 

(2)Jarvana

地址:http://www.jarvana.com/jarvana/

Jarvana提供了基于关键字、类名的搜索

 

(3)中央仓库

地址:http://search.maven.org/#browse

你可能感兴趣的:(仓库)