maven实战(三)maven仓库

来源:互联网 发布:海信电视mac是什么 编辑:程序博客网 时间:2024/05/17 07:48

当用户需要自定义仓库目录的时候,可以编辑文件~/.m2/settings.xml,设置localRepository元素的值为想要的仓库地址。例如:

<settings>  <localRepository>D:\java\repository\/localRepository></settings>

需要注意的是,默认情况下,~/.m2/settings.xml文件是不存在的,用户需要从Maven安装目录$M2_HOME$/conf/settings.xml复制此文件再进行编辑。

2.远程仓库的配置

很多情况下,默认的中央仓库无法满足项目的需求,可能项目需要额构建存在于另外一个远程仓库中,如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>      <snapshots>        <enabled>false</enabled>      </snapshots>      <layout>default</layout>    </repository>  </repositories></project>
声明了一个id为jboss的仓库。需要注意的是,Maven自带的中央仓库使用的id为central,如果其他的仓库声明也使用该id,就会覆盖中央仓库的配置。
该配置中的releases和snapshots元素比较重要,它们用来控制Maven对于发布构件和快照版构建的下载。这里需要注意的是enabled子元素,该例子中releases的enabled值为true,表示开启JBoss仓库的发布版本下载支持,而snapshots的enabled值为false,表示关闭JBoss仓库的快照版本的下载支持。

远程仓库的认证

大部分远程仓库都不需要认证,但有时候出于安全的考虑,比如公司内部构建了一个私服,就需要配置认证信息,配置认证信息与配置仓库信息不同,仓库信息可以在pom.xml文件中,认证信息必须在settings.xml文件中。
认证代码如下:
<settings>   ...     <servers>       <server>          <id>my-proj</id>          <username>repo-user</username>          <password>repo-pwd</password>       </server>     </servers>   ...</settings>
这里的关键是id元素,settings.xml中server元素的id必须和pom中需要认证的repository元素的id完全一致。换句话说,正是这个认证信息与仓库配置联系在了一起。

私服的一大作用是部署第三方构件,包括组织内部生成的构件以及一些无法从外部仓库直接获取的构件。无论日常开发中生成的构件,还是正式版本的构件,都需要部署到仓库中,供其他团队成员使用。

Maven除了能对项目进行编译、测试、打包外,还能将项目生成的构件部署到仓库中。首先需要编辑项目的pom.xml文件。配置distributionManagement元素,如下:
<project>  ...    <distributionManagement>      <repository>        <id>proj-releases</id>        <name>Proj Release Repository</name>        <url>http://192.168.1.100/content/repositories/proj-release</url>      </repository>      <snapshotRepository>        <id>proj-snapshots</id>        <name>Proj Snapshot Repository</name>         <url>http://192.168.1.100/content/repositories/proj-snapshots</url>      </snapshotRepository>    </distributionManagement>  ...</project>
distributionManagement包含repository和snapshotRepository子元素,前者表示发布版本构件的仓库,后者表示快照版本的仓库。
配置正确后,在命令行运行mvn clean deploy,Maven就会将项目构建输出的构件部署到配置对应的远程仓库。
如果当前项目的版本是发布版本就部署到发布版本的仓库,如果是快照版本就部署到快照版本的仓库。

快照版本

maven为什么要区分发布版本与快照版本呢?简单的1.0,1.1不就够了么,在此我们就可以提到SNAPSHOT到一个SNAPSHOT(快照版本)。
我们只要将版本的版本号设置为2.1-SNAPSHOT,然后发布到私服中,在发布的过程中,maven会自动为版本打上时间戳。比如2.1-20091214.221414-13就表示2009年12月14日22点14分14秒的第13次快照。有了该时间戳,Maven就能随时找到仓库中该构件2.1-SNAPSHOT版本最新的文件。这时,如果配置对于2.1-SNAPSHOT版本的依赖,当她构建模块B的时候,Maven会自动检测模块A的2.1-SNAPSHOT的最新构件,当发现有更新时便立即下载。
当项目经过完善的测试后需要发布后,就应该将快照版本改为发布版本。

镜像

如果仓库X可以提供Y存储的所有内容,那么就可以认为X是Y的一个镜像。换句话说,任何一个可以从仓库Y获得的构件,都能够从他的镜像中获取。举个例子,http://maven.net.cn/content/groups/public是中央仓库http://repol.maven.org/maven2/在中国的镜像,因此,可以配置Maven使用该镜像来替代中央仓库。编辑settings.xml,如下:
<settings>  ...  <mirrors>    <mirror>      <id>maven.net.cn</id>      <name>one of the central mirrors in china</name>      <url>http://maven.net.cn/content/groups/public</url>      <mirrorOf>central</mirrorOf>    </mirror>  </mirrors>  ...</settings>
该例中,<mirrorOf>的值为central,表示该配置为中央仓库d的镜像,任何对中央仓库的请求都会转至该镜像。
关于镜像的一个更为常见的用法是结合私服。由于私服可以代理任何外部的公共仓库,因此对于组织内的Maven用户来说,使用一个私服地址就等于使用了所有的外部仓库,这时可以配置一个这样的镜像:
<settings>  ...    <mirrors>      <mirror>        <id>internal-repository</id>        <name>Internal Repository Manager</name>        <url>http://192.168.1.100/maven2</url>        <mirrorOf>*</mirrorOf>      </mirror>    </mirrors>  ...</settings>
该例中<mirrorOf>的值为*,表示该配置是所有Maven仓库的镜像,任何对于远程仓库的请求都会转至http://192.168.1.100/maven2/。如果该镜像需要认证,则配置一个id为internal-repository的<server>即可。