Maven的仓库和l配置⽂件
(尊重劳动成果,转载请注明出处:冷⾎之⼼的博客)
快速导航:
⽬录
在Maven基础概念和安装配置⼀⽂中,我们简单学习了Maven是什么,安装包⾥边的各个⽂件夹都存放着哪些东西,并且进⾏了简单的安装配置。在本⽂中,我们将进⼀步学习了解何为Maven仓库以及Maven的配置⽂件l如何配置。
Maven的仓库
Maven⽤来存储依赖和插件的⼀个统⼀的地⽅,称之为仓库,Maven仓库⼜分为本地仓库和远程仓库。远程仓库⼜分为私服和中央仓库等。我们以⼀幅图来表⽰它们的关系:
本地仓库
就是maven在本地(我们的计算机上)存储构件(依赖的Jar包等)的仓库,默认是在⽤户的.m2/repository/⽬录下。需要注意的是刚开始在.m2/下边是没有这个repository/⽂件夹的,当我们在命令⾏中运⾏mvn命令后才会出现该⽂件夹,并且在该⽂件夹下存储我们从远程仓库下载的构件。
既然Maven默认在/.m2/repository/下存储依赖和构件,那么我们是不是可以改变⾃定义这个位置?
答案是肯定的,注意看图中的/.l 该⽂件是maven的配置⽂件,我们可以在该⽂件中通过标签<localRepository>
</localRepository>来配置本地仓库的位置。(l⽂件是啥?其作⽤是啥?我们需要如何配置将在下边详细讲解)
远程仓库
远程仓库⼜分为中央仓库,私服以及其它公共库,我们也借⽤⼀幅图来阐述它们之间的关系。
由图中可以看出,我们Maven⽤户是在和私服打交道,包括上传和下载构件,当私服满⾜不了我们的下
载构件需求时,私服会和中央仓库或者其余公共仓库交互,将⽤户需要的构件缓存在私服仓库中。那么何为私服?
私服
私服是⼀种特殊的远程仓库,它是架设在局域⽹内的仓库服务,私服代理⼴域⽹上的远程仓库,供局域⽹内的Maven⽤户使⽤。
局域⽹使⽤搭建maven私服的好处:
1.节省外⽹带宽:减少重复请求造成的外⽹带宽消耗,将⼤部分构件缓存在私服,⽤户和私服的交互⾛局域⽹。
2.加速Maven构件:如果项⽬配置了很多外部远程仓库的时候,构建速度就会⼤⼤降低,因为外⽹下载速度很慢。
3.部署第三⽅构件:有些构件⽆法从外部仓库获得的时候,可以把这些构件部署到内部仓库(私服)中,供内部maven项⽬使⽤。
4.提⾼稳定性:避免当外⽹不稳定的时候,maven构建也变的不稳定的情况。
5.增强控制:在公司内部可以访问私服可以通过配置⽤户名和密码来增强权限控制。
5.降低中央仓库的负荷:maven中央仓库被请求的数量是巨⼤的,配置私服也可以⼤⼤降低中央仓库的压⼒
中央仓库
Maven提供了⼀个中央仓库,其地址为:repo./maven2 ,该仓库包含了绝⼤多数流⾏的开源Java构件,以及源码、作者信息、SCM、信息、许可证信息等。据统计,每个⽉中央仓库⼤概会接受全世界Java程序员⼤概1亿次访问,其重要性不⾔⽽喻。
在上⼀节中,我们提到了maven的超级pom也是⼀种约定,所有的maven项⽬的pom⽂件都继承于该超级pom。(超级pom⽂件位于你的安装⽬录/apache-maven-3.2.5/lib/maven-model-builder-3.2.5.jar包中,并且在org/apache/maven/model/pom-4.l路径下)在超级Pom中,对于中央仓库进⾏了配置,如下所⽰:
注意看该配置中的标签<snapshots></snapshots>,该标签设置为false,表⽰我们不从该仓库中获取不稳定的SNAPSHOT版本的构件;其实还有⼀个<releases></releases>标签,表⽰我们是否从该仓库中获取稳定版本的构件;
⼀段⽐较完整的远程仓库的配置如下:
1. <repositories>
2.        <repository>
3.            <id>jboss</id>
4.            <name>JBoss Repository</name>
5.            <url>repository.jboss/maven2/</url>
6.            <releases>
7.                <updatePolicy>daily</updatePolicy><!-- never,always,interval n -->
8.                <enabled>true</enabled>
9.                <checksumPolicy>warn</checksumPolicy><!-- fail,ignore -->
10.            </releases>
11.            <snapshots>
12.                <enabled>false</enabled>
13.            </snapshots>
14.            <layout>default</layout>
15.        </repository>
16. </repositories>
<updatePolicy></updatePolicy>标签:表⽰Maven从远程仓库检查更新的频率,默认值是daily ,表⽰每天都检查⼀次;never-从不检查;always-每次构建都检查更新;interval n-每隔n分⽀检查⼀次更新。
<checksumPolicy></checksumPolicy>标签:表⽰maven检查和检验⽂件的策略,warn为默认值,还可以选择ignore和fail,表⽰当maven检查检验和⽂件失败之后应该采取的⾏动。
既然我们配置了远程仓库,那么是不是也需要在某个地⽅进⾏远程仓库的权限认证?否则谁都可以下载上传构件岂不是⼀件很⿇烦的事?
如何配置maven环境变量
答案当然也是肯定的,我们需要远程仓库的权限认证。我们可以在l配置⽂件中配置<servers></servers>来搞定
1. <servers>
2.    <server>
3.      <id>archiva.internal</id>  // release版本的⽤户名和密码
4.      <username>admin</username>
5.      <password>pwdpwd</password>
6.    </server>
7.    <server>
8.      <id>archiva.snapshots</id> // snapshot版本的⽤户名和密码
9.      <username>admin</username>
10.      <password>pwdpwd</password>
11.    </server>
12.  </servers>
需要注意的是:这⾥的<id>archiva.snapshots</id>必须与POM中需要认证的repository元素的Id⼀致,这样maven才能知道我们的⽤户名和密码是在认证哪个仓库。
配置了远程仓库并且进⾏了仓库的权限认证,maven已经可以帮助我们⾃动下载所需的构件了,当我们准备把⾃⼰的构件上传到远程仓库供别⼈使⽤时,我们还需要使⽤<distributionManagement></distributionManagement>来搞定。
1. <distributionManagement>
2.        <repository>
3.            <id>archiva.internal</id>
4.            <name>Internal Release Repository</name>
5.            <url>/nexus/content/repositories/releases/</url>
6.        </repository>
7.        <snapshotRepository>
8.            <id>archiva.snapshots</id>
9.            <name>Internal Snapshot Repository</name>
10.            <url>/nexus/content/repositories/snapshots/</url>
11.        </snapshotRepository>
12. </distributionManagement>
配置了之后,我们可以通过mvn deploy将本地的构件发布到远程仓库中。
当我们下载安装好Maven时,在其安装⽬录的conf下存在⼀个l的配置⽂件,这是⼀个全局的maven配置⽂件,为了不影响这台计算机上的其他⽤户,⼀般选择将该⽂件copy到 ~/.m2/下边,作为⼀个⽤户层⾯的配置⽂件。
localRepository:本地仓库的⽬录。默认是⽤户⽬录下⾯的.m2/repository⽬录。
interactiveMode:表⽰是否使⽤交互模式,默认是true;如果设为false,那么当Maven需要⽤户进⾏输⼊的时候,它会使⽤⼀个默认值。offline:表⽰是否离线,默认是false。这个属性表⽰在Maven进⾏项⽬编译和部署等操作时是否允许Maven进⾏联⽹来下载所需要的信息。mirrors:定义⼀系列的远程仓库的镜像,⽤于缓解远程仓库的压⼒。
profiles:⽤于指定⼀系列的profile。
activeProfiles:指定当前正在活跃的profile。
servers:表⽰当需要连接到⼀个远程服务器的时候需要使⽤到的验证⽅式。
接下来我们给出⼀个l的简单的配置⽂件⽰例:
1. <?xml version="1.0" encoding="UTF-8"?>
2. <settings>
3.  <mirrors>
4.    <mirror>
5.      <!--This sends everything else to /public -->
6.      <id>nexus</id>  // 镜像id
7.      <mirrorOf>*</mirrorOf>  // 表⽰代理所有仓库
8.      <url>/nexus/content/groups/public</url>  // 该镜像的地址
9.    </mirror>
10.  </mirrors>
11.  <profiles>
12.    <profile>
13.      <id>development</id>
14.      <repositories> // 构件的仓库
15.        <repository>
16.          <id>central</id>
17.          <url>nexus</url>
18.          <releases><enabled>true</enabled></releases>
19.          <snapshots><enabled>true</enabled></snapshots>
20.        </repository>
21.      </repositories>
22.      <pluginRepositories> // 插件的仓库
23.        <pluginRepository>
24.          <id>central</id>
25.          <url>nexus</url>
26.          <releases><enabled>true</enabled></releases>
27.          <snapshots><enabled>true</enabled></snapshots>
28.        </pluginRepository>
29.      </pluginRepositories>
30.    </profile>
31.  </profiles>
32.  <activeProfiles>
33.    <activeProfile>development</activeProfile> // 对于所有的pom,上边定义的id=development的profile都是活跃状态的
34.  </activeProfiles>
35.
36.  <servers>
37.    <server>
38.      <id>archiva.internal</id>  // release版本的⽤户名和密码
39.      <username>yangwenqiang</username>
40.      <password>pwdpwd</password>
41.    </server>
42.    <server>
43.      <id>archiva.snapshots</id> // snapshot版本的⽤户名和密码
44.      <username>yangwenqiang</username>
45.      <password>pwdpwd</password>
46.    </server>
47.  </servers>
48. </settings>
下边我们重点说两个⽐较有⽤的配置:
<mirrors></mirrors>:镜像,如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的⼀个镜像。说⽩了,任何⼀个可以从仓库Y获得的构件,都能够从它的镜像中获取。在上边的⽰例中,我们使⽤<url></url>中配置的来代理所有的远程仓库,其实这个代理⼀般情况下是你们公司的内⽹搭建的私服,在局域⽹内,加快访问速度等作⽤。
profiles:可以配置构件和插件的远程仓库,并且可以通过<id>来配置多个profile,最后通过<activeProfiles>来指定当前处于活跃状态(即有效
的)的profile配置是哪⼀个。
总结
这篇⽂章我们简单了解了maven的仓库,以及如何配置远程仓库,包括私服镜像和远程仓库的认证等知识点。当我们真正⼊职某⼀家公司的时候,我想很重要的⼀件事就是对着⾝边的⼀个哥们说:“Hi,⽼哥,把你的settings⽂件给我⼀份呗”
如果对你有帮助,记得点赞哦~欢迎⼤家关注我的博客,可以进366533258⼀起交流学习哦~
本给⼤家提供⼀个学习交流的平台,内设菜鸟Java管理员⼀枚、精通算法的⾦牌讲师⼀枚、Android管理员⼀枚、蓝⽛BlueTooth管理员⼀枚、Web前端管理⼀枚以及C#管理⼀枚。欢迎⼤家进来交流技术。