1. 仓库的布局

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

该路径与坐标对于的大致关系为:groupId/artifactId/version/artifactId-version.packaging

例子:log4j/log4j/1.2.15/log4j-1.2.15.jar

 

2. 仓库的分类

对于maven来说仓库只分两类:本地仓库和远程仓库

当maven根据坐标寻找构件的时候,它首先会看本地仓库,如果本地仓库存在此构件,则直接使用,如果不存在此构件,或者需要查看是否有更新的构件版本,maven就会去远程仓库查找,发现后下载到本地仓库

在此基础上,有些特殊的远程仓库,中央仓库是自带的远程仓库,私服是特殊的远程仓库,节省带宽和时间,其他公共库

2.1. 本地仓库

自定义本地仓库的地址

<localRepository>xxxxx\repository\</localRepository>

       只有一个构件在本地仓库了,才能被其他项目使用,那么构件如何进入到本地仓库?

mvn clean install

 

2.2. 远程仓库

安装好maven后,执行第一条maven命令才会创建本地仓库,然后根据配置和需要,从远程仓库下载构件至本地仓库

本地仓库只能有一个,但是可以配置访问很多远程仓库

 

2.3. 中央仓库

maven的安装文件自带了中央仓库的配置$M2_HOME/lib/maven-model-builder.jar

配置

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

这是所有的maven项目都会继承的超级pom,使用<id>作为对中央仓库的唯一标识

 

2.4. 私服

私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,私服代理广域网上的远程仓库。

优点:

  • 节省自己的外网带宽
  • 加速maven的构件,不停的请求连接外部仓库十分耗时,快照检查更新要求maven执行构建过程中不停检查远程仓库
  • 部署第三方构件,公司内部的构件可以放这里
  • 提高稳定性,增强控制,没网的时候,可以直接从这里拿
  • 降低中央仓库的负荷

3. 远程仓库的配置和认证

配置

<project>

    ...

    <repositories>

        //可以配置多个仓库

        <repository>

            //仓库的唯一标识

            <id>jboss</id>

            <name> JBoss Repository </name>

            <url>http://repository.jboss.com/maven2/ </url>

            //默认布局

            <layout>default</layout>

            //快照版构件下载

            <snapshots>

                <enabled>false</enabled>

                //标示maven从远程库检查更新的频率,默认上daily标示每天检查一次,never-从不检查,always-每次构建都检查更新,interval:x 每x分钟检查一次 x整数

                <updatePolicy>daily<updatePolicy>

                //配置maven检查检验和文件策略,下载和部署构件时候,会检验对应的校验和文件,warn-maven执行构建时候输出警告,fail-遇到错误就让构建是不,ignore-完全忽略

                <checksumPolicy>ignore</checksumPolicy>

            </snapshots>

            //发布版构件下下载

            <releases>

                <enabled>false</enabled>

            </releases>

        </repository>

    </repositories>

    ...

</project>

配置

<settings>

    ...

    <servers>

        <server>

            //这个必须和仓库的id一致,这里将仓库和认证绑定起来

            <id>my-proj</id>

            <username>xxx</username>

            <password>yyy</password>

        <server>

    </servers>

    ...

</settings>

大部分仓库不需要认证就能访问,但是有时候出去安全考虑需要提供认证信息才能访问一些远程仓库

配置认证和配置仓库不同,仓库可以放在pom中,配置认证必须放在settings中

 

 

4. 部署到远程仓库

配置

<project>

    ...

    <distributionManagement>

        //标示发布版本构件的仓库

        <repository>

            <id>jboss</id>

            <name> JBoss Repository </name>

            <url>http://repository.jboss.com/maven2/ </url>

        </repository>

        //标示快照版本构件的仓库

        <snapshotRepository>

            <id>jboss</id>

            <name> JBoss Repository </name>

            <url>http://repository.jboss.com/maven2/ </url>

        </snapshotRepository>

    </distributionManagement>

    ...

</project>

往仓库部署构件的时候,往往需要认证,就是在settings上创建个server元素

配置对应的远程仓库,如果项目版本上快照版本,则部署到快照仓库,否则部署在发布版本仓库

mvn clean deploy

 

5. 快照版本

快照版本为version 后加上SNAPSHOT的版本,这种版本发布过程中,maven会自动为构件打上时间戳,有了时间戳maven随时都能找到最新的构件

默认上一天检查一次更新,用户也可以-U强制更新

快照版本的出现,是为了让其他人能每次拉版本能拉最新版本,自动的获取最新,不然的话,在maven得改version才能变好坐标位置,本质上就是把开发要加的version变化交个了maven帮我们自动化

快照版本其本质上开发过程中,还未稳定的构件,可能有bug,或者需求变化,经过完善测试后,删除快照,变为稳定版本发布,将不带有时间戳

 

6. 镜像

如果说X可以提供Y存储的所有内容,那么就可以认为X说Y的一个镜像

配置

<settings>

    ...

    <mirrors>

        <mirror>

            <id>my-proj</id>

            <name> JBoss Repository </name>

            <url>http://192.106.2.1 </url>

            <mirrorOf>JBoss</mirrorOf>

        <mirror>

    </mirrors>

    ...

</settings>

表示,Jboss的仓库的请求都会被转发到http://192.106.2.1 这里

镜像也支持认证,同理配置个server即可

 

    <mirrorOf>*</mirrorOf> 匹配所有的远程仓库

        <mirrorOf>repo1,repo2</mirrorOf> 匹配仓库repo1,repo2

        <mirrorOf>*,!repo1</mirrorOf>  匹配所有远程,除了repo1

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