Maven 仓库
在以前使用Ant的时候,我们会建立一个lib目录在存放我们的jar包,比如项目所依赖的第三方包,每建立一个项目都要建立一个lib,不停的做copy工作,不仅是对于磁盘的浪费,而且也造成了版本管理上的麻烦。而且我们还需要通过提交到svn上来对lib进行管理,但是svn对于这种二进制文件的管理并不出色。
Maven仓库的初衷就是为了解决这个问题。 maven仓库是所有常用的第三方依赖包的集中营。这样所有的Maven项目就可以从这个仓库中获取所需要的资源,Maven仓库中对jar通过Group Id, Atifact Id, version 来管理,所以Maven项目可以很方便的进行依赖管理。你不需要自己来管理这个庞大的资源仓库,当然你可以创建一个公司层面的仓库,这个我在这个章节的后面会介绍。
Maven 仓库的两个概念:本地仓库和远程仓库
本地仓库是远程仓库的一个缓冲和子集,当你构建Maven项目的时候,首先会从本地仓库查找资源,如果没有,那么Maven会从远程仓库下载到你本地仓库。这样在你下次使用的时候就不需要从远程下载了。如果你所需要的jar包版本在本地仓库没有,而且也不存在于远程仓库,Maven在构建的时候会报错,这种情况可能发生在有些jar包的新版本没有在Maven仓库中及时更新。
Maven缺省的本地仓库地址为${user.home}/.m2/repository 。也就是说,一个用户会对应的拥有一个本地仓库。当然你可以通过修改${user.home}/.m2/settings.xml 配置这个地址:
3 | < localRepository > D:/java/repository</ localRepository > |
如果你想让所有的用户使用统一的配置,那么你可以修改${M2_HOME}/conf/setting.xml
还可以通过在运行时指定目录(不推荐这么做):
1 | mvn clean install -Dmaven.repo. local =/home/juven/myrepo/ |
当我们创建一个简单的Maven项目后(只需要在pom.xml配置好依赖项),运行mvn clean install就可以把项目构建好,maven会自动从中央仓库下载所需的依赖项(即jar包)。这个中央仓库定义在${M2_HOME}/lib/maven-2.0.10-uber.jar 里面。你可以在里面找到/org/apache/maven/project/pom-4.0.0.xml这个文件,在这个文件里面定义了中央仓库的地址:
04 | < name > Maven Repository Switchboard</ name > |
05 | < layout > default</ layout > |
06 | < url >http://repo1.maven.org/maven2</ url > |
08 | < enabled > false</ enabled > |
在 POM 中配置远程仓库
当某个依赖项存在于第三方的公共仓库时,我们需要配置其他远程仓库呢。下面是在pom.xml里面配置一个远程仓库的例子:
06 | < id > maven-net-cn</ id > |
07 | <name> Maven China Mirror</name> |
08 | <url> http://maven.net.cn/content/ groups /public/</url> |
10 | <enabled> true </enabled> |
13 | <enabled> false </enabled> |
22 | < id > maven-net-cn</ id > |
23 | <name> Maven China Mirror</name> |
24 | <url> http://maven.net.cn/content/ groups /public/</url> |
26 | <enabled> true </enabled> |
29 | <enabled> false </enabled> |
这里我们可以看到,允许配置多个repository和 plugin repository,其中<releases><enabled>true</enabled></releases>告诉Maven可以从这个仓库下载releases版本的构件,而<snapshots><enabled>false</enabled></snapshots>告诉Maven不要从这个仓库下载snapshot版本的构件。
Maven在使用第三方构件和插件时是分开来配置的,所以如果我们也希望插件的下载也通过我们的本地仓库来下载,那么我们就需要配置pluginRepository.
之所以不允许从某些仓库下载snapshot版本,是因为snapshot版本不稳定,但是某些snapshot版本,比如公司内部正在开发的项目, 是必须的
至于<pluginRepositories>,这是配置Maven从什么地方下载插件构件,Maven的所有行为都是通过插件来完成的。 <pluginRepository>的配置与<repository>类似,这里就不多说了。
在 settings.xml 中配置远程仓库
pom.xml的作用范围限于一个项目, 但一个公司/组织通常不只开发一个项目,那么为了避免重复配置,那么我们可以把一些公共配置放在${MAVEN_HOME}/conf/setting.xml(或${user.home}/.m2/setting.xml中。下面是在setting.xml中配置一个远程仓库的例子.
14 | < activeProfile >myProfiel</ activeProfile > |
这里通过<activeProfile>元素来激活这个profile,这样我们就可以全局的使用这个配置,不再需要为每个POM做重复的配置了(也可以针对特定的条件激活,比如某些profile只有在使用JDK 1.4时才生效)。
在实际的操作过程中,setting.xml最好不要配置远程仓库,最好能够通过nexus建立公司或者组织自己的仓库,然后把地址指向自己的仓库,后面我会介绍为什么要这么做以及怎么做。
配置maven仓库镜像
当你连接中央仓库时速度很慢,或有些国外的第三方仓库无法被访问时,你可以在setting.xml中为这些仓库指定一个镜像来加快下载依赖项的速度。下面是一个配置镜像的例子
08 | < id > maven-net-cn</ id > |
09 | < name > Maven China Mirror</ name > |
10 | < url > http://maven.net.cn/content/groups/public/</ url > |
11 | < mirrorOf >central</ mirrorOf > |
这里的
<mirrorOf>必须指定某个<repository>的Id. 如果想为所有的仓库做镜像, 那么可以改为:<mirrorOf>*</mirrorOf>