Maven仓库管理

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 配置这个地址:

1 <settings>  
2 ...
3   <localRepository> D:/java/repository</localRepository>  
4   ...
5 </settings>


如果你想让所有的用户使用统一的配置,那么你可以修改${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这个文件,在这个文件里面定义了中央仓库的地址:

01 <repositories>  
02   <repository>  
03     <id> central</id>  
04     <name> Maven Repository Switchboard</name>  
05     <layout> default</layout>  
06     <url>http://repo1.maven.org/maven2</url>  
07     <snapshots>  
08       <enabled> false</enabled>  
09     </snapshots>  
10   </repository>  
11 </repositories>



在 POM 中配置远程仓库

       当某个依赖项存在于第三方的公共仓库时,我们需要配置其他远程仓库呢。下面是在pom.xml里面配置一个远程仓库的例子:

01 <repositories> 
02     <repository>
03         // 其他远程仓库
04     </repository>
05     <repository>  
06       <id> maven-net-cn</id>  
07       <name> Maven China Mirror</name>  
08       <url> http://maven.net.cn/content/groups/public/</url>  
09       <releases>  
10         <enabled> true</enabled>  
11       </releases>  
12       <snapshots>  
13         <enabled> false</enabled>  
14       </snapshots>  
15     </repository>  
16   </repositories>  
17   <pluginRepositories>  
18     <pluginRepository>
19       // 其他maven插件仓库
20     </pluginRepository>
21     <pluginRepository>  
22       <id> maven-net-cn</id>  
23       <name> Maven China Mirror</name>  
24       <url> http://maven.net.cn/content/groups/public/</url>  
25       <releases>  
26         <enabled> true</enabled>  
27       </releases>  
28       <snapshots>  
29         <enabled> false</enabled>  
30       </snapshots>       
31     </pluginRepository>  
32   </pluginRepositories>

    这里我们可以看到,允许配置多个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中配置一个远程仓库的例子.

01 <settings>  
02   <profiles>
03     <profile>
04        <!-- 其他profile -->
05     </profile>
06     <profile>  
07       <id>myProfiel</id>  
08       <!--  在这里加入<repositories>及<pluginRepositories>  -->
09     </profile>  
10   </profiles>  
11     
12   <!-- 声明哪些profile被激活,或根据某些条件激活 -->
13   <activeProfiles>  
14     <activeProfile>myProfiel</activeProfile>  
15   </activeProfiles>  
16    
17 </settings>


     这里通过<activeProfile>元素来激活这个profile,这样我们就可以全局的使用这个配置,不再需要为每个POM做重复的配置了(也可以针对特定的条件激活,比如某些profile只有在使用JDK 1.4时才生效)。

     在实际的操作过程中,setting.xml最好不要配置远程仓库,最好能够通过nexus建立公司或者组织自己的仓库,然后把地址指向自己的仓库,后面我会介绍为什么要这么做以及怎么做。 

配置maven仓库镜像

    当你连接中央仓库时速度很慢,或有些国外的第三方仓库无法被访问时,你可以在setting.xml中为这些仓库指定一个镜像来加快下载依赖项的速度。下面是一个配置镜像的例子

01 <settings>  
02   ... 
03   <mirrors>  
04      <mirror>  
05       <!-- 其他镜像库 -->
06     </mirror>
07     <mirror>  
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>  
12     </mirror>  
13   </mirrors>  
14    ...
15 </settings>
这里的   <mirrorOf>必须指定某个<repository>的Id. 如果想为所有的仓库做镜像, 那么可以改为:<mirrorOf>*</mirrorOf>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值