maven坐标
maven的构件(jar包)是根据坐标来确定其在仓库的保存位置的。
maven的坐标是通过以下元素来定义的:
- groupId : 一般是当前项目的公司名和项目组
- artifactId : 项目名称
- version : 项目版本
- packaging : 打包方式,默认是
jar
,也可以是war
- classifier : 定义构建输出的一些附属构件,不常用
形如
<groupId>com.company.group</groupId>
<artifactId>MyApp</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
maven仓库
顾名思义,仓库就是存放依赖(jar包)的地方。
maven仓库分为本地仓库
,中央仓库
,远程仓库
,和私服
4种。
本地仓库
通俗的说,本地仓库就是我们本地电脑中的一个文件夹,用来存放jar包的仓库。
本地仓库的默认位置:无论是Windows还是Linux,在用户的目录下都有一个.m2/repository/的仓库目录。
可通过修改maven安装目录下的settings.xml文件来修改本地仓库位置。
<settings>
<localRepository>D:\repo</localRepository>
</settings>
中央仓库
中央仓库是默认的远程仓库,它包含了绝大多数流行的开源Java构件,以及源码、作者信息、SCM、信息、许可证信息等。id是central,url地址是http://repo1.maven.org/maven2
远程仓库
在很多情况下,默认的中央仓库无法满足项目的需求,可能项目需要的构件存在于另外一个远程仓库中,如:JBoss,Maven仓库。这时,可以在POM中配置该仓库,比如:
<project>
...
<repositories>
<repository>
<id>jboss</id>
<name>JBoss Repository</name>
<url>http://repository.jboss.com/maven2/</url>
<releases>
<!-- 更新频率never,always,interval,daily -->
<updatePolicy>daily</updatePolicy>
<enabled>true</enabled>
<!-- 检查和检验文件的策略,fail,warn,ignore -->
<checksumPolicy>warn</checksumPolicy>
</releases>
</repository>
<snapshots>
<enabled>false</enabled>
</snapshots>
<layout>default</layout>
</repositories>
...
</project>
在repositories元素下,用repository子元素声明一个或者多个远程仓库。该例中声明了一个id为jboss,名称为JBoss Repository的仓库。任何一个仓库声明的id必须是唯一的,尤其需要注意的是,maven自带的中央仓库使用的id为central
,如果其他的仓库声明也使用该id,就会覆盖中央仓库的配置。该配置中的url值指向了仓库的地址,一般来说,该地址都基于http协议,maven用户都可以在浏览器中打开仓库地址浏览构件。
该例配置中的releases和snapshots元素比较重要,它们用来控制Maven对于发布版构件和快照版构件的下载。该例中releases的enabled值为true,表示开启JBoss仓库的发布版本下载支持,而snapshots的enabled值为false,表示关闭JBoss仓库的快照版本的下载支持。该例中的layout元素值default表示仓库的布局是Maven2及Maven3的默认布局,而不是Maven1的布局。
远程仓库的认证
远程仓库默认无须认证就可访问,有时出于安全需要,可配置认证访问。
配置认证信息和配置仓库信息不同,仓库信息可以直接配置在POM文件中,但是认证信息必须配置在settings.xml文件中。这是因为POM往往是被提交到代码仓库中供所有成员访问的,而settings.xml一般只放在本机。因此,settings.xml中配置认证信息更为安全。
假设为id为my-proj的仓库配置认证信息,编辑settings.xml文件如下:
<settings>
...
<servers>
<server>
<id>my-proj</id>
<username>repo-user</username>
<password>repo-pwd</password>
</server>
</servers>
...
</settings>
** 注:settings.xml中server元素的id必须与POM中需要认证的repository元素的id完全一致。 **
私服
私服是架设在局域网的特殊远程仓库。一般maven自己的中央仓库存放了主流的jar包,但是有时候自己的编写的jar包就没办法在中央仓库找到了,这时候就需要配置一个远程仓库,就是所谓的“私服”,就可以将我们自己的jar包存放到远程仓库中,这样当maven需要下载jar包的时候,就可以先请求私服,如果私服上找不到,就会从maven的中央仓库再下载,之后也会缓存在私服上供以后使用。
镜像
这里另外说一下镜像。国内访问国外的仓库,你懂的,所以有必要配置镜像。在maven安装目录下的settings.xml配置文件中,可以配置镜像,在<Mirrors>
元素中,可配置一个或多个<mirror>
镜像。比如:
<mirror>
<id>nexus-osc</id>
<mirrorOf>central</mirrorOf>
<name>Nexus osc</name>
<url>http://maven.oschina.net/content/groups/public/</url>
</mirror>
mirrorOf
中写的是哪个仓库的镜像,例子中表明是中央仓库的镜像,这样,一切往中央仓库的请求,都会转发到去请求这个镜像的地址。所以,mirrorOf
中不能乱写。
镜像也可以配置基于id的仓库认证。
mirrorOf
中可以写*
,表示对一切的请求都会转到这个镜像。
** 为了满足复杂的规则,maven支持高级的镜像配置: **
-
<mirrorOf>*<mirrorOf>
: 匹配所有仓库 -
<mirrorOf>external:*<mirrorOf>
: 匹配所有不在本机上的远程仓库 -
<mirrorOf>repo1,repo2<mirrorOf>
: 匹配repo1和repo2,多个仓库用逗号隔开 -
<mirrorOf>*,!repo3<mirrorOf>
: 匹配所有仓库,除了repo3
*
匹配所有,这个镜像建议放在最后,否则maven循环匹配,匹配到第一个就是,满足,直接就结束了,其他镜像就不生效了。*
仓库搜索
在工作中,我们需要知道摸个依赖的坐标来使用,可以使用仓库搜索。
附上几个常用的搜索地址:
最后总结:
在pom中加入依赖声明后,maven会优先根据坐标去我们本地仓库查找,如果找到就用了。如果找不到,就会默认去中央仓库查找,然后下载到本地,然后使用。如果我们配置了私服或者其他远程仓库,就会从远程仓库查找,下载。如果我们有配置对应的镜像,就会从镜像下载使用了。