Maven最佳实践:Maven仓库 - 1

Maven最佳实践:Maven仓库

关键字: maven repository

什么是Maven仓库

在不用Maven的时候,好比说之前咱们用Ant构建项目,在项目目录下,每每会看到一个名为/lib的子目录,那里存放着各种第三方依赖jar文件,如log4j.jar,junit.jar等等。每创建一个项目,你都须要创建这样的一个/lib目录,而后复制一对jar文件,这是很明显的重复。重复永远是噩梦的起点,多个项目不共用相同的jar文件,不只会形成磁盘资源的浪费,也使得版本的一致性管理变得困难。此外,若是你使用版本管理工具,如SVN(你没有使用版本管理工具?立刻试试SVN吧,它能帮你解决不少头疼的问题),你须要将大量的jar文件提交到代码库里,但是版本管理工具在处理二进制文件方面并不出色。
Maven仓库就是放置全部JAR文件(WAR,ZIP,POM等等)的地方,全部Maven项目能够从同一个Maven仓库中获取本身所须要的依赖JAR,这节省了磁盘资源。此外,因为Maven仓库中全部的JAR都有其本身的坐标,该坐标告诉Maven它的组ID,构件ID,版本,打包方式等等,所以Maven项目能够方便的进行依赖版本管理。你也不在须要提交JAR文件到SCM仓库中,你能够创建一个组织层次的Maven仓库,供全部成员使用。
简言之,Maven仓库能帮助咱们管理构件(主要是JAR)。
 

本地仓库 vs. 远程仓库

运行Maven的时候,Maven所须要的任何构件都是直接从本地仓库获取的。若是本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,而后再使用本地仓库的构件。
好比说,你的项目配置了junit-3.8的依赖,在你运行 mvn test 的时候,Maven须要使用junit-3.8的jar文件,它首先根据坐标查找本地仓库,若是找到,就直接使用。若是没有,Maven会检查可用的远程仓库配置,而后逐个尝试这些远程仓库去下载junit-3.8的jar文件,若是远程仓库存在该文件,Maven会将其下载到本地仓库中,继而使用。若是尝试过全部远程仓库以后,Maven仍是没可以下载到该文件,它就会报错。
Maven缺省的本地仓库地址为 ${user.home}/.m2/repository 。也就是说,一个用户会对应的拥有一个本地仓库。
你也能够自定义本地仓库的位置,修改 ${user.home}/.m2/settings.xml  
Xml代码 
  1. <settings>  
  2.   ...  
  3.   <localRepository>D:\java\repository</localRepository>  
  4.   ...  
  5. </settings>  
你还能够在运行时指定本地仓库位置:
mvn clean install -Dmaven.repo.local=/home/juven/myrepo/
还有一点须要理解的是,当咱们运行install的时候,Maven其实是将项目生成的构件安装到了本地仓库,也就是说,只有install了以后,其它项目才能使用此项目生成的构件。
了解了本地仓库,接着了解一下Maven缺省的远程仓库,即Maven中央仓库。
安装好Maven以后,咱们能够创建一个简单的项目,配置一些简单的依赖,而后运行mvn clean install,项目就构建好了。咱们没有手工的去下载任何jar文件,这一切都是由于Maven中央仓库的存在,当Maven在本地仓库找不到须要的jar文件时,它会查找远程仓库,而一个原始的Maven安装就自带了一个远程仓库——Maven中央仓库。
这个Maven中央仓库是在哪里定义的呢?在个人机器上,我安装了maven-2.0.10,我能够找到这个文件: ${M2_HOME}/lib/maven-2.0.10-uber.jar ,打开该文件,能找到超级POM: \org\apache\maven\project\pom-4.0.0.xml ,它是全部Maven POM的父POM,全部Maven项目继承该配置,你能够在这个POM中发现以下配置:
Xml代码 
  1. <repositories>  
  2.   <repository>  
  3.     <id>central</id>  
  4.     <name>Maven Repository Switchboard</name>  
  5.     <layout>default</layout>  
  6.     <url>http://repo1.maven.org/maven2</url>  
  7.     <snapshots>  
  8.       <enabled>false</enabled>  
  9.     </snapshots>  
  10.   </repository>  
  11. </repositories>  
关于远程仓库的配置,下面的小节我会详细解释,这里咱们只要知道,中央仓库的id为central,远程url地址为http://repo1.maven.org/maven2,它关闭了snapshot版本构件下载的支持。
 

在POM中配置远程仓库

前面咱们看到超级POM配置了ID为central的远程仓库,咱们能够在POM中配置其它的远程仓库。这样作的缘由有不少,好比你有一个局域网的远程仓库,使用该仓库能大大提升下载速度,继而提升构建速度,也有可能你依赖的一个jar在central中找不到,它只存在于某个特定的公共仓库,这样你也不得不添加那个远程仓库的配置。
这里我配置一个远程仓库指向中央仓库的中国镜像:
Xml代码 
  1. <project>  
  2. ...  
  3.   <repositories>  
  4.     <repository>  
  5.       <id>maven-net-cn</id>  
  6.       <name>Maven China Mirror</name>  
  7.       <url>http://maven.net.cn/content/groups/public/</url>  
  8.       <releases>  
  9.         <enabled>true</enabled>  
  10.       </releases>  
  11.       <snapshots>  
  12.         <enabled>false</enabled>  
  13.       </snapshots>  
  14.     </repository>  
  15.   </repositories>  
  16.   <pluginRepositories>  
  17.     <pluginRepository>  
  18.       <id>maven-net-cn</id>  
  19.       <name>Maven China Mirror</name>  
  20.       <url>http://maven.net.cn/content/groups/public/</url>  
  21.       <releases>  
  22.         <enabled>true</enabled>  
  23.       </releases>  
  24.       <snapshots>  
  25.         <enabled>false</enabled>  
  26.       </snapshots>      
  27.     </pluginRepository>  
  28.   </pluginRepositories>  
  29. ...  
  30. </project>  
咱们先看一下<repositories>的配置,你能够在它下面添加多个<repository> ,每一个<repository>都有它惟一的ID,一个描述性的name,以及最重要的,远程仓库的url。此外, <releases><enabled>true</enabled></releases>告诉Maven能够从这个仓库下载releases版本的构件,而<snapshots><enabled>false</enabled></snapshots>告诉Maven不要从这个仓库下载snapshot版本的构件。禁止从公共仓库下载snapshot构件是推荐的作法,由于这些构件不稳定,且不受你控制,你应该避免使用。固然,若是你想使用局域网内组织内部的仓库,你能够激活snapshot的支持。
关于<repositories>的更详细的配置及相关解释,请参考: http://www.sonatype.com/books/maven-book/reference_zh/apas02s08.html
至于<pluginRepositories>,这是配置Maven从什么地方下载插件构件(Maven的全部实际行为都由其插件完成)。该元素的内部配置和<repository>彻底同样,再也不解释。
 

在settings.xml中配置远程仓库

咱们知道了如何在POM中配置远程仓库,但考虑这样的状况:在一个公司内部,同时进行这3个项目,并且之后随着这几个项目的结束,愈来愈多的项目会开始;同时,公司内部创建一个Maven仓库。咱们统一为全部这些项目配置该仓库,因而不得不为每一个项目提供一样的配置。问题出现了,这是 重复 !
其实咱们能够作到只配置一次,在哪里配置呢?就是settings.xml。
不过事情没有那么简单,不是简单的将POM中的<repositories>及<pluginRepositories>元素复制到settings.xml中就能够,setting.xml 不直接支持 这两个元素。但咱们仍是有一个并不复杂的解决方案,就是利用profile,以下:
Xml代码 
  1. <settings>  
  2.   ...  
  3.   <profiles>  
  4.     <profile>  
  5.       <id>dev</id>  
  6.       <!-- repositories and pluginRepositories here-->  
  7.     </profile>  
  8.   </profiles>  
  9.   <activeProfiles>  
  10.     <activeProfile>dev</activeProfile>  
  11.   </activeProfiles>  
  12.   ...  
  13. </settings>  
这里咱们定义一个id为dev的profile,将全部repositories以及pluginRepositories元素放到这个profile中,而后,使用<activeProfiles>元素自动激活该profile。这样,你就不用再为每一个POM重复配置仓库。
使用profile为settings.xml添加仓库提供了一种用户全局范围的仓库配置。
 

镜像

若是你的地理位置附近有一个速度更快的central镜像,或者你想覆盖central仓库配置,或者你想为全部POM使用惟一的一个远程仓库(这个远程仓库代理的全部必要的其它仓库),你可使用settings.xml中的mirror配置。
如下的mirror配置用maven.net.cn覆盖了Maven自带的central:
Xml代码 
  1. <settings>  
  2. ...  
  3.   <mirrors>  
  4.     <mirror>  
  5.       <id>maven-net-cn</id>  
  6.       <name>Maven China Mirror</name>  
  7.       <url>http://maven.net.cn/content/groups/public/</url>  
  8.       <mirrorOf>central</mirrorOf>  
  9.     </mirror>  
  10.   </mirrors>  
  11. ...  
  12. </settings>  
 
这里惟一须要解释的是<mirrorOf>,这里咱们配置central的镜像,咱们也能够配置一个全部仓库的镜像,以保证该镜像是Maven惟一使用的仓库:
Xml代码 
  1. <settings>  
  2. ...  
  3.   <mirrors>  
  4.     <mirror>  
  5.       <id>my-org-repo</id>  
  6.       <name>Repository in My Orgnization</name>  
  7.       <url>http://192.168.1.100/maven2</url>  
  8.       <mirrorOf>*</mirrorOf>  
  9.     </mirror>  
  10.   </mirrors>  
  11. ...  
  12. </settings>  
关于更加高级的镜像配置,能够参考:http://maven.apache.org/guides/mini/guide-mirror-settings.html。
相关文章
相关标签/搜索