5,maven仓库

一. 何为maven仓库

    Maven 在一个工作站上的某个位置统一存储所有 Maven 项目共享的构件,这个统一的位置就是仓库。 Maven 项目将不再各自存储其依赖的文件,它们只需要声明这些依赖项目的坐标,在需要的时候, Maven 会自动在仓库中找到它们,并使用它们。一个 Maven 项目构建完毕后生成的构件也可以安装到仓库中供其它项目使用。

二. 仓库的布局

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

    一个构件在仓库中的路径为:
    groupId/artifactId/baseVersion/artifactId-version(-classifier).packaging。
    其中 groupId 中的“ . ”会被替换成路径分隔符“ / ”, baseVersion 主要是对应 SNAPSHOT version 而言的,如果一个构建的 version 是 1.0.0-SNAPSHOT ,那baseVersion 就是 1.0.0 。例如:
    org.testing:testing:2.5.6-SNAPSHOT:jdk5:jar 就会对应到
    org/testing/testing/2.5.6/testing-2.5.6-SNAPSHOT-jdk5.jar

三. 仓库的分类

1. 分类

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

    当Maven寻找构件时会先查找本地仓库,如果本地仓库不存在此构件,或者需要查看是否有更新的构件版本,Maven就会去远程仓库查找,发现需要的构建够,下载到本地仓库再使用

    一些公共远程仓库:Java.net Maven库( http://download.java.net/maven/2 

JBoss Maven库(http://repository.jboss.com/maven2/ )。

2. 本地仓库

    Maven 默认的本地仓库位置是在用户目录下的 .m2/repository 下。也可以修改 .m2/settings.xml 自定义仓库位置:

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

       mvn clean install 可以将当前 Maven 项目构建出的构件安装到本地的仓库中。

3. 远程仓库

    每个用户只有一个本地仓库,但可以配置访问多个远程仓库。

4. 中央仓库

      Maven 默认自带了一个中央仓库,解压 lib/ maven-model-builder-3.0.jar  Maven2 中为 maven-2.2.1-uber.jar),然后访问路径 org/apache/maven/model/pom-4.0.0.xml  Maven2 中为 org/apache/maven/project/pom-4.0.0.xml ),可以看到:

<repositories>  
   <repository>  
     <id>central</id>  
     <name>Maven Repository Switchboard</name>  
     <url>http://repo1.maven.org/maven2 </url>  
     <layout>default</layout>  
     <snapshots>  
       <enabled>false</enabled>  
     </snapshots>  
   </repository>  
</repositories>

      Maven1  layout  legacy ,构件会有不同的文件路径。 snapshots  enabled 设为 false 表明 Maven 不会从该远程仓库下载 SNAPSHOT 版本的构件。

5. 私服

    私服是一种特殊的远程仓库

    使用私服的好处:

         1) 节省外网带宽。(构件缓存在局域网的私服上)

        2) 加速 Maven 构建。(构建时只需检查私服上的更新)

        3) 部署第三方构件。(有些构件因版权问题不能放在公共仓库上)

          4) 提高稳定性,增强控制( Internet 不稳定时不影响构建。 Nexus 有许多增强功能)

        5) 降低中央仓库的负荷

四. 远程仓库的配置

1. 远程仓库的配置

    可以修改项目的 POM ,添加远程仓库的配置:

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

    仓库的 id 必须是唯一的, Maven 自带的中央仓库的 id  central ,如果 POM 中声明的仓库id也是central会覆盖中央仓库。releasesenabledtruesnapshotsenabledfalse,表明该仓库只会下载release版本不会下载snapshot版本。

    snapshots releases中还可以包含updatePolicychecksumPolicy两个元素:

    updatePolicy表示检查更新的周期,可选值为:daily(每天检查一次), never(从不检查),always(每次构建都检查),interval:X(每隔X分钟检查一次)。默认值为daily

    checksumPolicy是用来表明校验失败时如何处理,可选值为warnfailignore。默认值为warn

2. 远程仓库的认证

    有些远程仓库需要认证,但认证信息不宜放在POM中,因为POM一般会被提交到代码仓库中,不安全。认证信息会被配置在settings.xml中:

<servers>  
   <server>  
     <id>jobs</id>  
     <username>usrname</username>  
     <password>passw0rd</password>  
   </server>  
</servers>

      id 要和仓库的 id 保持一致。

3. 部署至远程仓库

    可以在POM中配置构件想要部署到的远程仓库的信息:

<distributionManagement>  
   <repository>  
     <id>proj-release</id>  
     <name>Project Release Repository</name>  
     <url>http://192.168.1.100/content/repositories/proj-releases</url>  
   </repository>  
   <snapshortRepository>  
      <id>proj-snapshot</id>  
     <name>Project Snapshot Repository</name>  
     <url>http://192.168.1.100/content/repositories/proj-snapshots</url>  
   </snapshotRepository>  
</distributionManagement>

      repository 中配置的是项目稳定版本( release 版本)发布的仓库地址, snapshotRepository 中配置的是项目非稳定版本( snapshot 版本)发布的仓库地址。认证信息同样在 settings.xml 中的 servers 元素中配置。

    在命令行运行mvn clean deploy 就会将项目构建输出的构件部署到对应的远程仓库中。

五. 快照版本

    当 POM 中的项目版本定义为快照版本时,如 2.1-SNAPSHOT  Maven 在发布项目时会将 SNAPSHOT 替换成当前时间戳。如 2.1-20111203-174413-12 表示 2011  12  3  17  44  13 秒的第 12 次快照。而当 POM 中声明的依赖为 SNAPSHOT 版本时, Maven 会在远程仓库中寻找最新的快照。

    快照版本只应该在组织内部的项目或模块间依赖使用,而不应该依赖于组织外部的快照版本。因为快照版本是不稳定的,今天构建成功很可能明天就构建失败。

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

1. 依赖解析机制

        1)依赖为system时,直接从本地文件系统解析。

       2)本地仓库寻找构件,如果发现相应构件,则解析成功。

       3)本地仓库找不到构件时,到所有配置的远程仓库寻找构件。

2. 依赖的版本为RELEASE (最新 release 版本)或者 LATEST (最新版本)

    如果依赖的版本是RELEASE(最新release版本)或者LATEST(最新版本)。(这两者Maven3已经不支持,只有当不指定版本号时,Maven3默认为最新release版本)则基于更新策略读取所有远程仓库的groupId/artifactId/maven-metadata.xml中的元数据和与本地仓库中的元数据合并后,计算出真实的版本号再解析。Metadata信息如下:

<?xml version=”1.0” encoding=”UTF-8”?>  
 <metadata>  
   <groupId>org.sonatype.nexus</groupId>  
   <artifactId>nexus</artifact>  
   <versioning>  
     <latest>1.4.2-SNAPSHOT</latest>  
     <release>1.4.0</release>  
     <versions>  
       <version>1.3.5</version>  
       <version>1.3.6</version>  
       <version>1.4.0-SNAPSHOT</version>  
       …  
     </versions>  
     <lastUpdated>20111203180918</lastUpdated>  
   </versioning>  
</metadata>

3. 依赖的版本为 SNAPSHOT 

    如果依赖的版本是SNAPSHOT,则基于更新策略读取所有远程仓库的groupId/artifactId/version/maven-metadata.xml中的元数据和与本地仓库中的元数据合并后,计算出最新的快照版本的值,再进行解析。Metadata信息如下:

<?xml version=”1.0” encoding=”UTF-8”?>  
 <metadata>  
   <groupId>org.sonatype.nexus</groupId>  
   <artifactId>nexus</artifactId>  
     <version>1.4.2-SNAPSHOT</version>  
   <versioning>  
     <snapshot>  
       <timestamp>20111203.181523</timestamp>  
        <buildNumber>12</buildNumber>  
     </snapshot>  
     …  
     <lastUpdated>20111203181620</lastUpdated>  
   </versioning>  
</metadata>

4. 检查更新

    远程仓库的更新策略由远程仓库配置中(<repositories>元素)<releases>和<snapshots>中配置的<updatePolicy>决定,用户也可以在命令行加入参数-U来强制更新, Maven就会忽略updatePolicy。

七. 镜像

    如果所有可以从仓库 A 上获得的构件都可以从仓库 B 上获得,我们称仓库 B 为仓库 A 的镜像。可以修改settings.xml 来配置远程仓库的镜像:

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

    mirrorOf 可以取以下几种特殊值:
       * :所有远程仓库(通常私服为所有远程仓库的镜像)
       external:* :所有非本机上的远程仓库(使用 localhost 或 file:// 的除外)
       repo1,repo2 :多个仓库用逗号分隔
       *,! repo1 :所有远程仓库 repo1 除外。

八. 仓库搜索服务

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