仓库
在Maven中,任何一个依赖,插件或者项目构建的输出,都可以成为构件。
得益于坐标机制,任何Maven项目使用任何一个构件的方式都是完全相同的。在此基础上,Maven可以在某一个位置统一存放所有Maven项目共享的构件,这个统一的位置就是仓库。实际的Maven项目将不在各自存储其依赖文件,它们只需要声明这些依赖的坐标,在需要的时候,Maven会自动根据坐标找到仓库中的构件,并使用它们。
仓库的布局
任何一个构件都有其唯一的坐标,可以根据这个坐标定义其在仓库中的唯一存储路径,这便是Maven的仓库布局方式。
例如:log4j:log4j:1.2.15这一依赖,其对应的仓库路径为log4j/log4j/1.2.15/log4j-1.2.15.jar。该路径与坐标的大致对应关系为groupId / artifactId / version / artifactId-version.packaging。
Maven仓库是基于简单文件系统存储的。
仓库的分类
对于Maven来说,仓库只分为两类:本地仓库和远程仓库。
当Maven根据坐标寻找构件的时候,它首先会查看本地仓库,如果本地仓库存在此构件,则直接使用;如果本地仓库不存在此构件,或者需要查看是否有更新的构件版本,Maven就会去远程仓库查找,发现需要的构件之后,下载到本地仓库再使用。如果本地仓库和远程仓库都没有需要的构件,Maven就会报错。
远程仓库的分类:
- 中央仓库——是Maven核心自带的远程仓库,它包含了绝大部分开源的构件。在默认配置下,当本地仓库没有Maven需要的构件的时候,它就会尝试从中央仓库下载。
- 私服——在局域网内假设一个私有的仓库服务器。
- 其他公开的远程仓库——
本地仓库
一般来说,在Maven项目目录下,没有哲如lib/这样用来存放依赖文件的目录。当Maven在执行编译或测试时,如果需要使用依赖文件,它总是基于坐标使用本地仓库的依赖文件。
默认情况下,不管是在Windows还是Linux下,每个用户在自己的用户目录下都有一个路径名为.m2 / repository的仓库目录。
如果用户想要自定义本地仓库的目录地址,这时,可以编辑文件~/.m2/settings.xml,设置localRepository元素的值为想要的仓库地址,例如:
<settings>
<localRepository>D:\java\repository\<localRepository>
<settings>
远程仓库
当用户输入第一条Maven命令之后,Maven才会创建本地仓库,然后根据配置和需要,从远程仓库下载构件至本地仓库。
对于Maven来说,每一个用户只有一个本地仓库,但可以配置访问很多远程仓库。
- 中央仓库
中央仓库是一个默认的远程仓库,Maven的安装文件自带了中央仓库的配置。打开文件¥M2_HOME/lib/maven-model-builder-3.0.jar,访问路径org/apache/maven/model/pom-4.0.0.xml,看到如下配置:
<repositories>
<repository>
<id>central</id>
<name>Maven Repository Switchboard</name>
<url>http://repol.maven.org/maven2</url>
<layout>default</alyout>
<snapshot>
<enabled>false</enabled>
</snapshot>
</repository>
</repositories>
包含这段配置的文件是所有Maven项目都会继承的超级POM。
- 私服
私服是一种特殊的远程仓库,它是假设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的Maven用户使用。当Maven需要下载构件的时候,它从私服请求,如果私服上不存在该构件,则从外部的远程仓库下载,缓存在私服上之后,再为Maven的下载提供请求服务。
远程仓库的配置
如果项目需要的构件存在于另外一个远程仓库中,如JBoss Maven仓库,这时,可以在POM中配置该仓库,例如:
<project>
... ...
<repositories>
<repository>
<id>jboss</id>
<name>JBoss Repository/name>
<url>http://repository.jboss.com.maven2/</url>
<release>
<enabled>true</enabled>
</release>
<snapshot>
<enabled>false</enabled>
</snapshot>
<layout>default</alyout>
</repository>
</repositories>
...
</project>
在repositories元素下,可以使用repository子元素声明一个或者多个远程仓库。任何一个仓库声明的id必须是唯一的。如果其他仓库声明使用中央残酷的id——central,就会覆盖中央仓库的配置。
release子元素enabled的为true,表示开启JBoss仓库的发布版本下载支持。
snapshot的enabled的值为flase,表示关闭JBoss仓库的快照版本的支持,Maven只会从JBoss仓库下载发布版的构件,而不会下载快照版的构件。
对于release和snapshot来说,除了enabled,它们还包含另外两个子元素updatePolicy和checksumPolicy:
远程仓库的认证
大部分远程仓库无须认证就可以访问,但有时候出于安全方面的考虑,需要提供认证信息才能访问一些远程仓库。
配置认证信息和配置仓库信息不同,仓库信息可以直接配置在POM文件中,但是认证信息必须配置在settings.xml文件中。
假设需要一个id为my-proj的仓库配置认证信息,编辑settings.xml文件如下:
<settings>
... ...
<servers>
<server>
<id>my-proj</id>
<username>repo-user</username>
<password>repo-pwd</passoword>
</server>
</servers>
... ...
</settings>
settings.xml中server元素的id必须与POM中需要认证的repository元素的id完全一致,
这个id将认证信息与仓库配置联系在了一起。
仓库搜索服务
使用Maven进行日常开发的时候,一个常见的问题就是如何寻找需要的依赖,我们可能只知道需要使用类库的项目名称,但添加Maven依赖要求提供确切的Maven坐标。这时,就可以使用仓库所有服务来根据关键字得到Maven坐标。
https://repository.sonatype.org/
http://www.mvnrepository.com/